cf Round 633
A.Rebus(思维题)
给出一个这种形式的表达式 ? + ? - ? + ? = n.
要求用1-n的数字填充疑问号使等式成立,如果不存在这样的方式,则输出不可能。
存在则输出任意的方式。
移项可以变成?+?+?...=n+?+?+...的形式,可以求出等式左边和右边的取值范围,如果不相交则无解,然后贪心构造一下即可。
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <iostream>
# include <vector>
# include <queue>
# include <stack>
# include <map>
# include <math.h>
# include <algorithm>
using namespace std;
# define lowbit(x) ((x)&(-x))
# define pi acos(-1.0)
# define MAXN
# define eps 1e-
# define MAXM
# define MOD
# define INF
# define mem(a,b) memset(a,b,sizeof(a))
# define FOR(i,a,n) for(int i=a; i<=n; ++i)
# define FO(i,a,n) for(int i=a; i<n; ++i)
# define bug puts("H");
# define lch p<<,l,mid
# define rch p<<|,mid+,r
# pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long LL;
typedef unsigned long long ULL;
int _MAX(int a, int b){return a>b?a:b;}
int _MIN(int a, int b){return a>b?b:a;}
int Scan() {
int res=, flag=;
char ch;
if((ch=getchar())=='-') flag=;
else if(ch>=''&&ch<='') res=ch-'';
while((ch=getchar())>=''&&ch<='') res=res*+(ch-'');
return flag?-res:res;
}
void Out(int a) {
if(a<) {putchar('-'); a=-a;}
if(a>=) Out(a/);
putchar(a%+'');
} char s[];
int vis[], cnt=, ans[]; int main()
{
int p, fu=, zheng=, n=;
gets(s);
vis[]=;
for (int i=; ; i+=) {
if (s[i]=='=') {p=i; break;}
else if (s[i]=='+') vis[++cnt]=, zheng++;
else if (s[i]=='-') vis[++cnt]=-, fu++;
}
for (int i=p+; s[i]; ++i) n=n*+s[i]-'';
if (n*zheng<n+fu||n+fu*n<zheng) puts("Impossible");
else {
puts("Possible");
if (n*zheng>=n+fu&&n+fu>=zheng) {
int mod=(n+fu)%zheng;
for (int i=; i<=cnt; ++i) {
if (vis[i]==-) ans[i]=;
else {
ans[i]=(n+fu)/zheng;
if (mod) ans[i]++, mod--;
}
}
}
else {
int mod=(zheng-n)%fu;
for (int i=; i<=cnt; ++i) {
if (vis[i]==) ans[i]=;
else {
ans[i]=(zheng-n)/fu;
if (mod) ans[i]++, mod--;
}
}
}
for (int i=; i<=cnt; ++i) {
if (i) printf(vis[i]==?"+ ":"- ");
printf("%d ",ans[i]);
}
printf("= %d\n",n);
}
return ;
}
B.International Olympiad(思维题)
题意:给出每次奥林匹克的缩写,第一次是1989年,缩写为9,每次不能重复,
问给出n个询问,每个询问是一个缩写,问真实的年份是多少。
我们观察发现
1989-1998 占了个位数的全部
1999-2098 占了十位数的全部
2099-3098 占了百位数的全部
3099-13098 占了万位数的全部
于是我们可以找出规律,直接搞就行了。
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <iostream>
# include <vector>
# include <queue>
# include <stack>
# include <map>
# include <math.h>
# include <algorithm>
using namespace std;
# define lowbit(x) ((x)&(-x))
# define pi acos(-1.0)
# define MAXN
# define eps 1e-
# define MAXM
# define MOD
# define INF
# define mem(a,b) memset(a,b,sizeof(a))
# define FOR(i,a,n) for(int i=a; i<=n; ++i)
# define FO(i,a,n) for(int i=a; i<n; ++i)
# define bug puts("H");
# define lch p<<,l,mid
# define rch p<<|,mid+,r
# pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long LL;
typedef unsigned long long ULL;
int _MAX(int a, int b){return a>b?a:b;}
int _MIN(int a, int b){return a>b?b:a;}
int Scan() {
int res=, flag=;
char ch;
if((ch=getchar())=='-') flag=;
else if(ch>=''&&ch<='') res=ch-'';
while((ch=getchar())>=''&&ch<='') res=res*+(ch-'');
return flag?-res:res;
}
void Out(int a) {
if(a<) {putchar('-'); a=-a;}
if(a>=) Out(a/);
putchar(a%+'');
} char s[]; int main ()
{
int n;
scanf("%d",&n);
while (n--) {
scanf("%s",s);
int len=strlen(s+), year=atoi(s+), F=, ten=;
FO(i,,len) {
F+=ten;
ten*=;
}
while (year<+F) year+=ten;
printf("%d\n",year);
}
return ;
}
C.Graph Coloring(二分图染色)
给出n个顶点,m条边的无向图(n,m<=1e5).
初始时每条边有一种颜色R或者B。
每操作一次可以选定一个点,并将该点邻接的边颜色全都取反,问至少需要多少次这样的操作可以将所有的边变成一种颜色。
如果不存在输出-1.
分析:
分为两种情况,要么最后边都是R,要么都是B
假设最后都会变成R,我们发现对于任意一个边(u,v),
如果边uv是R,那么u,v都需要操作一次,或者都不需要操作。
因为每一个顶点操作两次是没有必要的,所以我们可以发现对于每个顶点,要么不操作,要么操作一次。
于是我们可以把它们按操作数是否相等划分到S-T集合里面去,如果边uv是R,则u,v属于同一集合。如果边uv是B,则u,v属于不同的集合。
最后的答案就是S和T集合模的最小值。
如果图不连通,我们可以对他的强连通分量做。
于是问题就转化成了二分图染色了
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <iostream>
# include <vector>
# include <queue>
# include <stack>
# include <map>
# include <math.h>
# include <algorithm>
using namespace std;
# define lowbit(x) ((x)&(-x))
# define pi acos(-1.0)
# define MAXN
# define eps 1e-
# define MAXM
# define MOD
# define INF
# define mem(a,b) memset(a,b,sizeof(a))
# define FOR(i,a,n) for(int i=a; i<=n; ++i)
# define FO(i,a,n) for(int i=a; i<n; ++i)
# define bug puts("H");
# define lch p<<,l,mid
# define rch p<<|,mid+,r
# pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long LL;
typedef unsigned long long ULL;
int _MAX(int a, int b){return a>b?a:b;}
int _MIN(int a, int b){return a>b?b:a;}
int Scan() {
int res=, flag=;
char ch;
if((ch=getchar())=='-') flag=;
else if(ch>=''&&ch<='') res=ch-'';
while((ch=getchar())>=''&&ch<='') res=res*+(ch-'');
return flag?-res:res;
}
void Out(int a) {
if(a<) {putchar('-'); a=-a;}
if(a>=) Out(a/);
putchar(a%+'');
} struct Edge{int p, next, flag;}edge[MAXN<<];
int head[MAXN], set[MAXN], cnt=, ans1[MAXN], ans2[MAXN], num1, num2, node[MAXN], vis[MAXN];
int one, two; void add_edge(int u, int v, char flag)
{
int x=(flag=='R'?:-);
edge[cnt].p=v; edge[cnt].next=head[u]; edge[cnt].flag=x; head[u]=cnt++;
edge[cnt].p=u; edge[cnt].next=head[v]; edge[cnt].flag=x; head[v]=cnt++;
}
int find(int x)
{
int s, temp;
for (s=x; set[s]>=; s=set[s]) ;
while (s!=x) temp=set[x], set[x]=s, x=temp;
return s;
}
void union_set(int x, int y)
{
int temp=set[x]+set[y];
if (set[x]>set[y]) set[x]=y, set[y]=temp;
else set[y]=x, set[x]=temp;
}
bool dfs(int x, int mark)
{
for (int i=head[x]; i; i=edge[i].next) {
int v=edge[i].p;
if (node[v]) {
if (mark==edge[i].flag&&node[v]!=node[x]) return false;
if (mark!=edge[i].flag&&node[v]==node[x]) return false;
continue;
}
node[v]=(mark==edge[i].flag?node[x]:-node[x]);
node[v]==?one++:two++;
if (dfs(v,mark)==) return false;
}
return true;
}
void find1(int x, int flag)
{
vis[x]=;
if (node[x]==flag) ans1[++num1]=x;
for (int i=head[x]; i; i=edge[i].next) {
int v=edge[i].p;
if (vis[v]) continue;
find1(v,flag);
}
}
void find2(int x, int flag)
{
vis[x]=;
if (node[x]==flag) ans2[++num2]=x;
for (int i=head[x]; i; i=edge[i].next) {
int v=edge[i].p;
if (vis[v]) continue;
find2(v,flag);
}
}
int main ()
{
int n, m, u, v;
int flag1=, flag2=;
scanf("%d%d",&n,&m);
char s[];
mem(set,-);
while (m--) {
scanf("%d%d%s",&u,&v,s);
add_edge(u,v,s[]);
u=find(u); v=find(v);
if (u!=v) union_set(u,v);
}
FOR(i,,n) {
if (set[i]<) {
node[i]=; one=, two=;
if (dfs(i,)==) {flag1=; break;}
if (one>two) find1(i,-);
else find1(i,);
}
}
mem(vis,); mem(node,);
FOR(i,,n) {
if (set[i]<) {
node[i]=-; one=, two=;
if (dfs(i,-)==) {flag2=; break;}
if (one>two) find2(i,-);
else find2(i,);
}
}
if (flag1== && flag2==) {puts("-1"); return ;}
if (flag1==) num1=INF;
else if (flag2==) num2=INF;
if (num1>num2) {
printf("%d\n",num2);
FOR(i,,num2) printf("%d ",ans2[i]);
putchar('\n');
}
else {
printf("%d\n",num1);
FOR(i,,num1) printf("%d ",ans1[i]);
putchar('\n');
}
return ;
}
D.To Hack or not to Hack(枚举+DP)
显然可以hack的题数超过90时一定是第一名。
否则我们可以枚举每道题的基本分,确定好每题最多能hack多少人。从而可以确定我们的最终分数。
基本分一定时,hack人数当然越多越好。
令dp[i][a][b][c]表示前i个人A题hack了a次,B题hack了b次,C题hack了c次的最高排名。
若不能hack,或分数较少,则直接转移。否则枚举每题的hack状态进行转移即可。
复杂度O(6^3*(n+90*30^3*2^3))
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <iostream>
# include <vector>
# include <queue>
# include <stack>
# include <map>
# include <math.h>
# include <algorithm>
using namespace std;
# define lowbit(x) ((x)&(-x))
# define pi acos(-1.0)
# define MAXN
# define eps 1e-
# define MAXM
# define MOD
# define INF
# define mem(a,b) memset(a,b,sizeof(a))
# define FOR(i,a,n) for(int (i)=(a); (i)<=(n); ++(i))
# define FO(i,a,n) for(int (i)=(a); (i)<(n); ++(i))
# define bug puts("H");
# define lch p<<,l,mid
# define rch p<<|,mid+,r
# pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long LL;
typedef unsigned long long ULL;
int _MAX(int a, int b){return a>b?a:b;}
int _MIN(int a, int b){return a>b?b:a;}
int Scan() {
int res=, flag=;
char ch;
if((ch=getchar())=='-') flag=;
else if(ch>=''&&ch<='') res=ch-'';
while((ch=getchar())>=''&&ch<='') res=res*+(ch-'');
return flag?-res:res;
}
void Out(int a) {
if(a<) {putchar('-'); a=-a;}
if(a>=) Out(a/);
putchar(a%+'');
} int n, a[][], sum[], hack[], cnt, dp[][][][], sco[][]; int cal(int x, int y, int z)
{
if (sco[x][]>sco[x][]||sco[y][]>sco[y][]||sco[z][]>sco[z][]) return n-;
if (sum[]-hack[]>sco[x][]||sum[]-hack[]>sco[y][]||sum[]-hack[]>sco[z][]) return n-;
if (sum[]<sco[x][]||sum[]<sco[y][]||sum[]<sco[z][]) return n-;
int h1=min(sum[]-sco[x][], hack[]);
int h2=min(sum[]-sco[y][], hack[]);
int h3=min(sum[]-sco[z][], hack[]);
int mysco=(h1+h2+h3)*+(a[][]!=)*(x+)**(-abs(a[][]))/+(a[][]!=)*(y+)**(-abs(a[][]))/+(a[][]!=)*(z+)**(-abs(a[][]))/;
int flag=, tot=;
FOR(i,,h1) FOR(j,,h2) FOR(k,,h3) dp[][i][j][k]=INF;
dp[][][][]=;
FOR(i,,n) {
int hesco=(a[i][]!=)*(x+)**(-abs(a[i][]))/+(a[i][]!=)*(y+)**(-abs(a[i][]))/+(a[i][]!=)*(z+)**(-abs(a[i][]))/;
if (a[i][]>=&&a[i][]>=&&a[i][]>=) {
if (hesco>mysco) tot++;
continue;
}
else if (hesco<=mysco) continue;
int wei=;
FOR(j,,) {
if (a[i][j]<) wei=wei*+;
else wei<<=;
}
FOR(q1,,h1) FOR(q2,,h2) FOR(q3,,h3) dp[flag^][q1][q2][q3]=INF;
FOR(q1,,h1) FOR(q2,,h2) FOR(q3,,h3) {
if (dp[flag][q1][q2][q3]>n) continue;
FOR(j,,(wei>>)&) FOR(k,,(wei>>)&) FOR(l,,wei&) {
int shesco=(j==&&a[i][])*(x+)**(-abs(a[i][]))/+(k==&&a[i][])*(y+)**(-abs(a[i][]))/+(l==&&a[i][])*(z+)**(-abs(a[i][]))/;
if (shesco>mysco) dp[flag^][q1+j][q2+k][q3+l]=min(dp[flag^][q1+j][q2+k][q3+l], dp[flag][q1][q2][q3]+);
else dp[flag^][q1+j][q2+k][q3+l]=min(dp[flag^][q1+j][q2+k][q3+l], dp[flag][q1][q2][q3]);
}
}
flag^=;
}
int ans=INF;
FOR(i,,h1) FOR(j,,h2) FOR(k,,h3) ans=min(ans, dp[flag][i][j][k]);
return ans+tot;
}
int main ()
{
scanf("%d",&n);
FOR(i,,n) {
scanf("%d%d%d",&a[i][],&a[i][],&a[i][]);
FOR(j,,) sum[j]+=(a[i][j]!=);
if(i!=) FOR(j,,) hack[j]+=(a[i][j]<);
}
// 特判
if (hack[]+hack[]+hack[]>=) {puts(""); return ;}
// 每个范围的分数
int P=;
FOR(i,,) sco[i][]=n/(*P)+, sco[i][]=n/P, P*=;
sco[][]=, sco[][]=n/;
int ans=INF;
FOR(i,,) FOR(j,,) FOR(k,,) ans=min(ans,cal(i,j,k));
printf("%d\n",ans+);
return ;
}
E.Binary Table(待填坑)
cf Round 633的更多相关文章
- CF Round #551 (Div. 2) D
CF Round #551 (Div. 2) D 链接 https://codeforces.com/contest/1153/problem/D 思路 不考虑赋值和贪心,考虑排名. 设\(dp_i\ ...
- CF Round #510 (Div. 2)
前言:没想到那么快就打了第二场,题目难度比CF Round #509 (Div. 2)这场要难些,不过我依旧菜,这场更是被\(D\)题卡了,最后\(C\)题都来不及敲了..最后才\(A\)了\(3\) ...
- UOJ #30. [CF Round #278] Tourists
UOJ #30. [CF Round #278] Tourists 题目大意 : 有一张 \(n\) 个点, \(m\) 条边的无向图,每一个点有一个点权 \(a_i\) ,你需要支持两种操作,第一种 ...
- 竞赛题解 - CF Round #524 Div.2
CF Round #524 Div.2 - 竞赛题解 不容易CF有一场下午的比赛,开心的和一个神犇一起报了名 被虐爆--前两题水过去,第三题卡了好久,第四题毫无头绪QwQ Codeforces 传送门 ...
- 【前行&赛时总结】◇第4站&赛时9◇ CF Round 513 Div1+Div2
◇第4站&赛时9◇ CF Round 513 Div1+Div2 第一次在CF里涨Rating QWQ 深感不易……作blog以记之 ( ̄▽ ̄)" +Codeforces 的门为你打 ...
- CF Round #600 (Div 2) 解题报告(A~E)
CF Round #600 (Div 2) 解题报告(A~E) A:Single Push 采用差分的思想,让\(b-a=c\),然后观察\(c\)序列是不是一个满足要求的序列 #include< ...
- CF Round #580(div2)题解报告
CF Round #580(div2)题解报告 T1 T2 水题,不管 T3 构造题,证明大约感性理解一下 我们想既然存在解 \(|a[n + i] - a[i]| = 1\) 这是必须要满足的 既然 ...
- CF round #622 (div2)
CF Round 622 div2 A.简单模拟 B.数学 题意: 某人A参加一个比赛,共n人参加,有两轮,给定这两轮的名次x,y,总排名记为两轮排名和x+y,此值越小名次越前,并且对于与A同分者而言 ...
- Codeforces Round #633 (Div. 2)
Codeforces Round #633(Div.2) \(A.Filling\ Diamonds\) 答案就是构成的六边形数量+1 //#pragma GCC optimize("O3& ...
随机推荐
- 30分钟学会XAML
1.狂妄的WPF 相对传统的Windows图形编程,需要做很多复杂的工作,引用许多不同的API.例如:WinForm(带控件表单).GDI+(2D图形).DirectX API(3D图形)以及流媒体和 ...
- CSS3与页面布局学习总结(一)——概要、选择器、特殊性与刻度单位
web前端开发者最最注的内容是三个:HTML.CSS与JavaScript,他们分别在不同方面发挥自己的作用,HTML实现页面结构,CSS完成页面的表现与风格,JavaScript实现一些客户端的功能 ...
- 读书笔记--SQL必知必会03--排序检索数据
3.1 排序数据 子句(clause) SQL语句由子句构成.一个子句通常由一个关键字加上所提供的数据组成. ORDER BY子句可以取一个或多个列的名字,将SELECT语句检索出的数据进行排序. O ...
- Spark的DataFrame的窗口函数使用
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 SparkSQL这块儿从1.4开始支持了很多的窗口分析函数,像row_number这些,平时写程 ...
- 【Spring】SpringMVC中浅析Date类型数据的传递
在控制器中加入如下代码: @InitBinder public void initBinder(ServletRequestDataBinder bin){ SimpleDateFormat sdf ...
- Spring boot: Request method 'DELETE' not supported, Request method 'PUT' not supported, Request method 'POST' not supported
GET,POST,PUT,DELETE, Spring都支持,不要怀疑Spring, 一定是前端发送的rest 请求和后端的响应不匹配, 查找原因以及解决办法, 很简单 用chrome打开F12控制台 ...
- java web学习总结(二十六) -------------------JSP属性范围
所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围. 一.JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:一个属性只能在一个页面中取得 ...
- LAMP布署笔记
源代码软件的优点: 获得最新版,能及时修复bug: 能自行修改和定制: 源代码打包形式: .tar.gz和.tar.bz2格式居多: 完整性校验: md5sum校验工具 ...
- node-sass报错解决方法
在Vue.js中,每一个vue文件都是一个组件,在.vue文件中可以将模板,脚本,样式写在一起,便于组织整个组件.在使用template,script时,编写css样式时,都进行的特别顺利,唯独当我想 ...
- SharePoint 是哪些人设计、开发的?
闲下来的时候,我有时候会想:SharePoint 是哪些人设计.开发的? 毕竟,你说一个单选的字段,你从列表里面添加的时候,字段类型选的是 “Yes/No”:而如果你是通过编程把它加入列表的时候,字段 ...