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的更多相关文章

  1. CF Round #551 (Div. 2) D

    CF Round #551 (Div. 2) D 链接 https://codeforces.com/contest/1153/problem/D 思路 不考虑赋值和贪心,考虑排名. 设\(dp_i\ ...

  2. CF Round #510 (Div. 2)

    前言:没想到那么快就打了第二场,题目难度比CF Round #509 (Div. 2)这场要难些,不过我依旧菜,这场更是被\(D\)题卡了,最后\(C\)题都来不及敲了..最后才\(A\)了\(3\) ...

  3. UOJ #30. [CF Round #278] Tourists

    UOJ #30. [CF Round #278] Tourists 题目大意 : 有一张 \(n\) 个点, \(m\) 条边的无向图,每一个点有一个点权 \(a_i\) ,你需要支持两种操作,第一种 ...

  4. 竞赛题解 - CF Round #524 Div.2

    CF Round #524 Div.2 - 竞赛题解 不容易CF有一场下午的比赛,开心的和一个神犇一起报了名 被虐爆--前两题水过去,第三题卡了好久,第四题毫无头绪QwQ Codeforces 传送门 ...

  5. 【前行&赛时总结】◇第4站&赛时9◇ CF Round 513 Div1+Div2

    ◇第4站&赛时9◇ CF Round 513 Div1+Div2 第一次在CF里涨Rating QWQ 深感不易……作blog以记之 ( ̄▽ ̄)" +Codeforces 的门为你打 ...

  6. CF Round #600 (Div 2) 解题报告(A~E)

    CF Round #600 (Div 2) 解题报告(A~E) A:Single Push 采用差分的思想,让\(b-a=c\),然后观察\(c\)序列是不是一个满足要求的序列 #include< ...

  7. CF Round #580(div2)题解报告

    CF Round #580(div2)题解报告 T1 T2 水题,不管 T3 构造题,证明大约感性理解一下 我们想既然存在解 \(|a[n + i] - a[i]| = 1\) 这是必须要满足的 既然 ...

  8. CF round #622 (div2)

    CF Round 622 div2 A.简单模拟 B.数学 题意: 某人A参加一个比赛,共n人参加,有两轮,给定这两轮的名次x,y,总排名记为两轮排名和x+y,此值越小名次越前,并且对于与A同分者而言 ...

  9. Codeforces Round #633 (Div. 2)

    Codeforces Round #633(Div.2) \(A.Filling\ Diamonds\) 答案就是构成的六边形数量+1 //#pragma GCC optimize("O3& ...

随机推荐

  1. 数据库精华知识点总结(1)—数据库的三层模式和二级映像,E-R(实体联系图)图,关系模型

    Data base: 长期存储在计算机内,有组织的,可共享的大量数据集合.基本特征:永久存储,可共享,有一定的物理和逻辑结构. Data base manage system(DBMS):用户和os之 ...

  2. [原创]django+ldap实现统一认证部分二(python-ldap实践)

    前言 接上篇文章 [原创]django+ldap实现统一认证部分一(django-auth-ldap实践) 继续实现我们的统一认证 python-ldap 我在sso项目的backend/lib/co ...

  3. 打造高效前端工作环境-tmuxinator

    前言  虽然tmux能让我们方便组织工作环境,但每次重新打开会话时都需要手动重新创建窗口.窗格和执行各种程序,能不能像VS那样以工程为单位保存窗口.窗格和各种所需执行的程序的信息呢?tmuxinato ...

  4. LCM性质 + 组合数 - HDU 5407 CRB and Candies

    CRB and Candies Problem's Link Mean: 给定一个数n,求LCM(C(n,0),C(n,1),C(n,2)...C(n,n))的值,(n<=1e6). analy ...

  5. 你所不知道的linq

    问题的提出 昨天在qq群问了一个linq的问题被人鄙视了.题目大概类似于 var reuslt=from s in new List<string>() select s; 问from.. ...

  6. java类的初始化顺序

    在java中,当我们new一个对象时,对象中的成员,初始化块以及构造方法的加载是有一定的顺序的,看下面一副图: 一.单类(无基类)下的初始化顺序: public class Parent { stat ...

  7. 关于xml加载提示: Error on line 1 of document : 前言中不允许有内容

    我是在java中做的相关测试, 首先粘贴下报错: 读取xml配置文件:xmls\property.xml org.dom4j.DocumentException: Error on line 1 of ...

  8. Struts 2 数据校验要用到的类和两种校验方式以及一些校验问题的解决

    通过继承ActionSupport类来完成Action开发,ActionSupport类不仅对Action接口进行简单实现, 同时增加了验证.本地化等支持 .真实开发中自定义Action都需要继承该类 ...

  9. hibernate的get和load的区别

    在hibernate中我们知道如果要从数据库中得到一个对象,通常有两种方式,一种是通过session.get()方法,另一种就是通过session.load()方法,然后其实这两种方法在获得一个实体对 ...

  10. 【原】Bootstrap+Knockout.JS+ASP.Net MVC3+PetaPOCO实现CRUD操作

    1.需求: 1.1)页面要美观大气 1.2)前端代码要简洁清晰,要用MVC或是MVVM框架 1.3)服务端要用MVC框架,要Rest风格 1.4)数据访问要用ORM 2.效果: 2.1)列表 2.2) ...