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& ...
随机推荐
- 读书笔记--SQL必知必会06--用通配符进行过滤
6.1 LIKE操作符 通配符(wildcard),用来匹配某些值的的特殊字符. 在搜索子句中必须通过LIKE操作符使用通配符. 通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用通配符 ...
- 你真的会玩SQL吗?和平大使 内连接、外连接
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- CSS知识总结(四)
CSS常用样式 2.元素样式 1)宽度 width:auto|length 单位:设置以像素计的宽度值(px) 设置以百分比计的宽度值(%) 例:p {width:200px;} div {width ...
- 版本控制工具Git的学习笔记
在网上看到一个很不错的Git教程,学习后果断要做一下总结. 教程地址:http://www.liaoxuefeng.com/ 总结要点: 安装Git因为我个人的开发主要是基于windows环境下,所以 ...
- Java进击C#——应用开发之WinForm开发
本章简言 上一章笔者介绍了关于WinForm环境.这一章笔者将继续讲WinForm.只不过更加的面向开发了.事实就是在学习工具箱里面的控件.对于WinForm开发来讲,企业对他的要求并没有那么高.但是 ...
- 来份ASP.NET Core尝尝
0x01.前言 学习ASP.NET Core也有一段时间了,虽说很多内容知识点还是处于一知半解的状态,但是基本的,还是 略懂一二.如果有错误,还望见谅. 本文还是和之前一样,Demo+在Linux下运 ...
- 『.NET Core CLI工具文档』(七)dotnet-new
说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:dotnet-new 翻译:dotnet-new 名称 dotnet-new -- 创建一个新的 .NET Core 项 ...
- 节省Json流量
今天在实验当中发现了很不错的节省json流量方式,来做个笔记给大家分享一下. 如果跟服务器传递键值对的数组,我们一般会采用下面方式 创建一个字段 public class kv { public st ...
- ASP.NET MVC传递参数(model)
一看到此标题,相信你也会.因为路由是可以从URL地址栏传过去的. 但是Insus.NET不想在地址栏传递,还是一个条件是jQuery的Ajax进行POST的.Insus.NET不清楚别人是怎样处理的, ...
- 怎么解决tomcat占用8080端口问题
怎么解决tomcat占用8080端口问题 相信很多朋友都遇到过这样的问题吧,tomcat死机了,重启eclipse之后,发现 Several ports (8080, 8009) requir ...