Codeforces gym 2013-2014 Samara SAU ACM ICPC Quarterfinal Qualification Contest
来源:互联网 发布:java jwt token 例子 编辑:程序博客网 时间:2024/05/15 11:59
题目地址:http://codeforces.com/gym/100247
2014.10.27版
26号训练的题,今天发现A题有更高效的解法,用到了前缀最大值和后缀最大值
On the Jedi Tournament n Jedi are battling each other. Every Jedi has three parameters: strength, agility and intelligence. All parameters of all Jedi are different. When two Jedi have a fight, the winner will be the Jedi which has more parameters higher compared to the same parameters of his opponent. For example, Jedi with parameters (5, 9, 10) defeats Jedi with parameters (2, 12, 4) because of first and third parameters.
Sith have a plan to turn one the Jedi to the dark side of the Force. It will give him a powerful skill that allows to swap some his parameters, maybe more than one time, before every fight. Sith wish their new apprentice to defeat all of the remaining Jedi.
Which Jedi can be used by Sith to lead their plan to success?
The first line contains the only integer n (1 ≤ n ≤ 200000) — the number of the Jedi.
Then n lines follow. Each of them contains three integers separated by space: ai, bi and ci (1 ≤ ai, bi, ci ≤ 109) — the parameters of the Jedi.
All ai, bi and ci are pairwise distinct.
In the first line output one integer m — the number of the suitable Jedi.
In the second line output m integers — the numbers of these Jedi — in the ascending order.
45 9 102 12 48 7 36 11 1
21 4
44 1 115 8 92 12 67 3 10
32 3 4
先讲最优的算法O(n)解决的
每次读入的时候调整,保证ai<bi<ci
记录下这个人前面的所有人ai的最大值,bi的最大值,ci的最大值,我把它成为前缀最大值
同样,记录后缀最大值
这个人如果符合题意当且仅当
他的最大值ci 大于从头到上一个人的bi 前缀最大值 且 大于从尾到后一个人的bi 后缀最大值
他的次大值bi 大于从头到上一个人的ai 前缀最大值 且 大于从尾到后一个人的ai 后缀最大值
代码如下:
//Hello. I'm Peter#include<cstdio>#include<iostream>#include<sstream>#include<cstring>#include<string>#include<cmath>#include<cstdlib>#include<algorithm>#include<functional>#include<cctype>#include<ctime>#include<stack>#include<queue>#include<vector>#include<set>#include<map>using namespace std;typedef long long ll;typedef long double ld;#define peter cout<<"i am peter"<<endl#define input freopen("data.txt","r",stdin)#define randin srand((unsigned int)time(NULL))#define INT (0x3f3f3f3f)*2#define LL (0x3f3f3f3f3f3f3f3f)*2#define gsize(a) (int)a.size()#define len(a) (int)strlen(a)#define slen(s) (int)s.length()#define pb(a) push_back(a)#define clr(a) memset(a,0,sizeof(a))#define clr_minus1(a) memset(a,-1,sizeof(a))#define clr_INT(a) memset(a,INT,sizeof(a))#define clr_true(a) memset(a,true,sizeof(a))#define clr_false(a) memset(a,false,sizeof(a))#define clr_queue(q) while(!q.empty()) q.pop()#define clr_stack(s) while(!s.empty()) s.pop()#define rep(i, a, b) for (int i = a; i < b; i++)#define dep(i, a, b) for (int i = a; i > b; i--)#define repin(i, a, b) for (int i = a; i <= b; i++)#define depin(i, a, b) for (int i = a; i >= b; i--)#define pi acos(-1.0)#define eps 1e-6#define MOD 1000000007#define MAXN#define N 200100#define Mint n,a,b,c;struct Digit{ int a,b,c;}d[N];int prefixmax[N][3];int suffixmax[N][3];int order[10],num_ans,ans[N];int main(){ cin>>n; repin(i,1,n){ scanf("%d %d %d",&a,&b,&c); order[1]=a,order[2]=b,order[3]=c; sort(order+1,order+1+3); d[i].a=order[1]; d[i].b=order[2]; d[i].c=order[3]; } repin(i,1,n){ prefixmax[i][0]=max(prefixmax[i-1][0],d[i].a); prefixmax[i][1]=max(prefixmax[i-1][1],d[i].b); prefixmax[i][2]=max(prefixmax[i-1][2],d[i].c); } depin(i,n,1){ suffixmax[i][0]=max(suffixmax[i+1][0],d[i].a); suffixmax[i][1]=max(suffixmax[i+1][1],d[i].b); suffixmax[i][2]=max(suffixmax[i+1][2],d[i].c); } num_ans=0; repin(i,1,n){ if(d[i].c>prefixmax[i-1][1] && d[i].b>prefixmax[i-1][0]){ if(d[i].c>suffixmax[i+1][1] && d[i].b>suffixmax[i+1][0]){ ans[++num_ans]=i; } } } cout<<num_ans<<endl; bool first=true; repin(i,1,num_ans){ if(first) first=false; else printf(" "); printf("%d",ans[i]); } printf("\n");}
下面这个方法复杂度是O(nlogn)的,虽然复杂度高了,的确没有上一个高效,而且空间耗费也大
但是,这个方法用到了一个三维变成一维的办法,有助于算法思想提高。
还有,感谢鬼子王提供这个思路给我0.0
把三维的变成一维的,最多有6*10^5这么多个数,然后从小到大排序,题目保证了每个数两两不同
当然,是对结构体数组排序,结构体存储这个数,这个数对应的哪个人
同时,存储两个变量
一个是,从1到此,出现次数>=1有多少人
一个是,从1到此,出现次数>=2有多少人
由于一个人有3个变量,所有出现次数最多为3,且一定会有3。
当碰到出现次数为3时,查找之前记录下的此人在出现次数为2时的位置
如果3这个位置之前出现次数>=2的人数为n 且 2那个位置之前出现次数>=1的人数也为n,这个人就是符合题意的人
扫一遍,调用2个map,就可以知道符合题意的人分别是谁了
代码如下:
#include<cstdio>#include<iostream>#include<cstring>#include<cstdlib>#include<algorithm>#include<map>using namespace std;typedef long long ll;#define len(a) (int)strlen(a)#define slen(s) (int)s.length()#define repin(i, a, b) for (int i = a; i <= b; i++)#define MAXN 600100#define N 200100struct Digit{ int id,x; int num1,num2;}d[MAXN];bool comp(const Digit a,const Digit b){ return a.x<b.x;}int ans[N],num_ans;int num_d;int num1,num2,n,a,b,c;map<int,int>apptime;map<int,int>sp;int main(){ cin>>n; int num_d=0,t; repin(i,1,n){ scanf("%d %d %d",&a,&b,&c); t=++num_d; d[t].id=i; d[t].x=a; t=++num_d; d[t].id=i; d[t].x=b; t=++num_d; d[t].id=i; d[t].x=c; } sort(d+1,d+1+num_d,comp); num1=num2=0; apptime.clear(),sp.clear(); num_ans=0; repin(i,1,num_d){ t=apptime[d[i].id]; t+=1; if(t==3){ int w=sp[d[i].id]; if(d[w].num1==n && num2==n){ int t=++num_ans; ans[t]=d[i].id; } } else{ if(t==1) num1+=1; else if(t==2){ num2+=1; sp[d[i].id]=i; } apptime[d[i].id]=t; d[i].num1=num1; d[i].num2=num2; } } if(num_ans!=0) sort(ans+1,ans+1+num_ans); printf("%d\n",num_ans); bool first=true; repin(i,1,num_ans){ if(first) first=false; else printf(" "); printf("%d",ans[i]); } printf("\n");}
Let's call two strings similar if there exists a bijective mapping over characters, which, when applied to the characters of the first string, makes it equal to the second string. For example, «abacaba» and «tetatet» are similar strings, but «test» and «bear» — are not. Given the set of strings, find the number of pairs of similar strings.
The first line contains one integer n — the number of strings.
Next n lines contain non-empty strings of lowercase Latin letters. The sum of lengths of these strings does not exceed 106.
Output the only integer —the number of pairs of similar strings.
4abacabatetatettestbear
1
4jurycodewillpass
2
4yourcodewontpass
3
这题,用一个map<vector<int>,int>m; 记录
vector 存储的是这个字符串每个字母出现的早晚,用数字表示
比如abcabcdea
a是第一个出现的,就为0,b为1,c为2,d为3 e为4
则对应的vector应为 0 1 2 0 1 2 3 4 0
由于字母是'a'-'z',vector里的数不会超过25
vector就是一种hash方式,正确的讲所有同种类型的串 映射 到一个vector上,而map的second值表示这个vector出现了多少次
这样子每个串在map中查找,维护ans,并且再更新map,复杂度为O(nlogn)的方法,就可以得到答案了
代码如下:
//Hello. I'm Peter.#include<cstdio>#include<iostream>#include<sstream>#include<cstring>#include<string>#include<cmath>#include<cstdlib>#include<algorithm>#include<functional>#include<cctype>#include<ctime>#include<stack>#include<queue>#include<vector>#include<set>#include<map>using namespace std;typedef long long ll;typedef long double ld;#define peter cout<<"i am peter"<<endl#define input freopen("data.txt","r",stdin)#define randin srand((unsigned int)time(NULL))#define INT (0x3f3f3f3f)*2#define LL (0x3f3f3f3f3f3f3f3f)*2#define gsize(a) (int)a.size()#define len(a) (int)strlen(a)#define slen(s) (int)s.length()#define pb(a) push_back(a)#define clr(a) memset(a,0,sizeof(a))#define clr_minus1(a) memset(a,-1,sizeof(a))#define clr_INT(a) memset(a,INT,sizeof(a))#define clr_true(a) memset(a,true,sizeof(a))#define clr_false(a) memset(a,false,sizeof(a))#define clr_queue(q) while(!q.empty()) q.pop()#define clr_stack(s) while(!s.empty()) s.pop()#define rep(i, a, b) for (int i = a; i < b; i++)#define dep(i, a, b) for (int i = a; i > b; i--)#define repin(i, a, b) for (int i = a; i <= b; i++)#define depin(i, a, b) for (int i = a; i >= b; i--)#define pi acos(-1.0)#define eps 1e-6#define MOD 1000000007#define MAXN 1001000#define N#define Mint idx(char c){ return c-'a';}char s[MAXN];int n,num,apptime[30];map<vector<int>,ll>m;ll ans;int main(){// input; cin>>n; ans=0; repin(i,1,n){ scanf("%s",s); int len=len(s); repin(i,0,25){ apptime[i]=0; } num=0; vector<int>v; v.clear(); rep(j,0,len){ int c=idx(s[j]); int t; if(apptime[c]==0){ t=apptime[c]=++num; } else t=apptime[c]; v.pb(t); } ans+=m[v]; m[v]+=1; } cout<<ans<<endl;}
Unacknowledged scientist Victor conducts a pseudoscientific research of the relation between integers that cross his mind and the integer that comes into his assistant's mind. He wrote the integers a1, ..., an which had crossed his mind. Then it turned up that the integer s had come into his assistant's mind. Victor wants to determine how many consecutive non-empty sets of integers al, al + 1, ..., ar(l ≤ r) have the sum al + al + 1 + ... + ar = s.
The first line contains two integers separated by space: n and s (1 ≤ n ≤ 200000, - 2·1014 ≤ s ≤ 2·1014) — the number of integers which crossed Victor's mind and the integer that came into his assistant's mind.
The second line contains n integers separated by space: ai ( - 109 ≤ ai ≤ 109) — the integers which crossed Victor's mind.
Output the only integer — the number of consecutive non-empty sets of integers which have the sum s.
5 2-1 1 2 -1 1
5
6 33 -2 1 -1 1 2
3
这题很简单
维护一个前缀和,dp一下就行了
今天朋友终于明白这个方法名字叫“前缀和”,还有朋友争论了很久0.0,其实我早就会了,没想到它有这么高冷的名字
顺便说下,前缀和方法在cf里频繁出现,尤其是div2 c题
代码如下:
//Hello. I'm Peter.#include<cstdio>#include<iostream>#include<sstream>#include<cstring>#include<string>#include<cmath>#include<cstdlib>#include<algorithm>#include<functional>#include<cctype>#include<ctime>#include<stack>#include<queue>#include<vector>#include<set>#include<map>using namespace std;typedef long long ll;typedef long double ld;#define peter cout<<"i am peter"<<endl#define input freopen("data.txt","r",stdin)#define randin srand((unsigned int)time(NULL))#define INT (0x3f3f3f3f)*2#define LL (0x3f3f3f3f3f3f3f3f)*2#define gsize(a) (int)a.size()#define len(a) (int)strlen(a)#define slen(s) (int)s.length()#define pb(a) push_back(a)#define clr(a) memset(a,0,sizeof(a))#define clr_minus1(a) memset(a,-1,sizeof(a))#define clr_INT(a) memset(a,INT,sizeof(a))#define clr_true(a) memset(a,true,sizeof(a))#define clr_false(a) memset(a,false,sizeof(a))#define clr_queue(q) while(!q.empty()) q.pop()#define clr_stack(s) while(!s.empty()) s.pop()#define rep(i, a, b) for (int i = a; i < b; i++)#define dep(i, a, b) for (int i = a; i > b; i--)#define repin(i, a, b) for (int i = a; i <= b; i++)#define depin(i, a, b) for (int i = a; i >= b; i--)#define pi acos(-1.0)#define eps 1e-6#define MOD 1000000007#define MAXN 1001000#define N#define Mint n;ll s,t,ans,sum,t1;map<ll,ll>m;int main(){// input; m.clear(); cin>>n>>s; ans=sum=0; repin(i,1,n){ scanf("%lld",&t); sum+=t; t1=sum-s; ans+=m[t1]; m[sum]+=1; if(sum==s) ans+=1; } cout<<ans<<endl;}
Little known hacker Heaven just got access to the secret information about problems of some major programming contest. He wants to change statement of one of the problems to sabotage the contest.
For Heaven, initial and target statements are just strings of zeroes and ones. He can take any substring of initial statement and negate it — replace each zero with one, and each one with zero.
Heaven would like to leave no trace of his actions, so he wants to minimize the number of steps in turning initial statement to target.
The first line contains one integer n (1 ≤ n ≤ 200000) — the length of the strings.
Then two strings of «0» and «1» follow — the binary codes of initial and target statement.
Output one integer — the minimal possible number of steps.
6101010110011
2
710101010011100
3
这题我就不讲了,谁都会做,签到题
//Hello. I'm Peter.#include<cstdio>#include<iostream>#include<sstream>#include<cstring>#include<string>#include<cmath>#include<cstdlib>#include<algorithm>#include<functional>#include<cctype>#include<ctime>#include<stack>#include<queue>#include<vector>#include<set>#include<map>using namespace std;typedef long long ll;typedef long double ld;#define peter cout<<"i am peter"<<endl#define input freopen("data.txt","r",stdin)#define randin srand((unsigned int)time(NULL))#define INT (0x3f3f3f3f)*2#define LL (0x3f3f3f3f3f3f3f3f)*2#define gsize(a) (int)a.size()#define len(a) (int)strlen(a)#define slen(s) (int)s.length()#define pb(a) push_back(a)#define clr(a) memset(a,0,sizeof(a))#define clr_minus1(a) memset(a,-1,sizeof(a))#define clr_INT(a) memset(a,INT,sizeof(a))#define clr_true(a) memset(a,true,sizeof(a))#define clr_false(a) memset(a,false,sizeof(a))#define clr_queue(q) while(!q.empty()) q.pop()#define clr_stack(s) while(!s.empty()) s.pop()#define rep(i, a, b) for (int i = a; i < b; i++)#define dep(i, a, b) for (int i = a; i > b; i--)#define repin(i, a, b) for (int i = a; i <= b; i++)#define depin(i, a, b) for (int i = a; i >= b; i--)#define pi acos(-1.0)#define eps 1e-6#define MOD 1000000007#define MAXN 200100#define N#define Mint n,ans;bool start;char s1[MAXN],s2[MAXN];int main(){// input; cin>>n; scanf("%s %s",s1,s2); ans=0; start=false; rep(i,0,n){ if(s1[i]==s2[i]){ if(!start) continue; else{ ans+=1; start=false; } } else{ if(!start) start=true; } } if(start) ans+=1; cout<<ans<<endl;}
Once the boy named Richard received the cat as a gift. Of course, he immediately started to think up how to name him. Three his friends offered their variants: strings a, b and c of equal lengths n. Richard notes the distance between strings s1 and s2 as a number of positions in which the characters in these strings differ. For example, , . Richard wants to please his friends and name the cat such the name s that is minimal.
The first line contains one integer n (1 ≤ n ≤ 200000) — the length of the strings.
Then three strings a, b и c of the same length n follow — the names offered by Richard's friends. The strings consist of the lowercase Latin letters.
Output the only string of the length n, consisting of the lowercase Latin letters — the name for the cat. If there are many possible names satisfying the condition, output any of them.
6needleturkeybottle
turtle
很简单
每一列3个元素
如果都相同,输出,此时单列p值为0
如果都不同,输出第一个,此时单列p值为2
如果存在两个相同,输出相同的,此时单列p值为1
代码如下:
//Hello. I'm Peter.#include<cstdio>#include<iostream>#include<sstream>#include<cstring>#include<string>#include<cmath>#include<cstdlib>#include<algorithm>#include<functional>#include<cctype>#include<ctime>#include<stack>#include<queue>#include<vector>#include<set>#include<map>using namespace std;typedef long long ll;typedef long double ld;#define peter cout<<"i am peter"<<endl#define input freopen("data.txt","r",stdin)#define randin srand((unsigned int)time(NULL))#define INT (0x3f3f3f3f)*2#define LL (0x3f3f3f3f3f3f3f3f)*2#define gsize(a) (int)a.size()#define len(a) (int)strlen(a)#define slen(s) (int)s.length()#define pb(a) push_back(a)#define clr(a) memset(a,0,sizeof(a))#define clr_minus1(a) memset(a,-1,sizeof(a))#define clr_INT(a) memset(a,INT,sizeof(a))#define clr_true(a) memset(a,true,sizeof(a))#define clr_false(a) memset(a,false,sizeof(a))#define clr_queue(q) while(!q.empty()) q.pop()#define clr_stack(s) while(!s.empty()) s.pop()#define rep(i, a, b) for (int i = a; i < b; i++)#define dep(i, a, b) for (int i = a; i > b; i--)#define repin(i, a, b) for (int i = a; i <= b; i++)#define depin(i, a, b) for (int i = a; i >= b; i--)#define pi acos(-1.0)#define eps 1e-6#define MOD 1000000007#define MAXN 200100#define N#define Mint n;char s[3][MAXN];char c1,c2,c3;int main(){// input; cin>>n; scanf("%s %s %s",s[0],s[1],s[2]); rep(i,0,n){ c1=s[0][i],c2=s[1][i],c3=s[2][i]; if(c1==c2 && c2==c3) printf("%c",c1); else if(c1!=c2 && c1!=c3 && c2!=c3) printf("%c",c1); else if(c1==c2) printf("%c",c1); else if(c2==c3) printf("%c",c2); else if(c1==c3) printf("%c",c1); } printf("\n");}
- Codeforces gym 2013-2014 Samara SAU ACM ICPC Quarterfinal Qualification Contest
- CF 2013-2014 Samara SAU ACM ICPC Quarterfinal Qualification Contest C.Victor's Research
- CF 2013-2014 Samara SAU ACM ICPC Quarterfinal Qualification Contest B. Similar Strings
- CF - gym - Samara University ACM ICPC 2016-2017 Quarterfinal Qualification Contest --- G
- Samara University ACM ICPC 2016-2017 Quarterfinal Qualification Contest【8/13】
- [Codeforces Gym 101243][2016acm/icpc Quarterfinal Central region of Russia]
- Codeforces GYM 100548 K - Last Defence 2014-2015 ACM-ICPC, Asia Xian Regional Contest
- Codeforces GYM 100548 F - Color 2014-2015 ACM-ICPC, Asia Xian Regional Contest
- codeforces/2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest, qualification stage (B)
- Gym 101243 (2016-2017 ACM Central Region of Russia Quarterfinal Programming Contest)
- Codeforces gym 2011-2012, Samara Interacademic Programming
- [CF Gym 100827C] Containment [2014-2015 ACM-ICPC Pacific Northwest Regional Contest C]
- [CF Gym 100827E] Hill Number [2014-2015 ACM-ICPC Pacific Northwest Regional Contest E]
- [CF Gym 100827F] Knights [2014-2015 ACM-ICPC Pacific Northwest Regional Contest F]
- [CF Gym 100827K] Towers [2014-2015 ACM-ICPC Pacific Northwest Regional Contest K]
- 2014-2015 ACM-ICPC, Central Europe Regional Contest (CERC 14) [Gym-100543G]
- Codeforces GYM 100548 I - International Collegiate Routing Contest 2014 ACM Xian Regional Contest
- Codeforces Gym 2015 ACM Amman Collegiate Programming Contest
- android开发使用SQLite之写日记
- 在python下安装app一般有几种方法:
- 支付宝的性能测试
- Android主题和样式之系统篇(下)
- 容量规划概述
- Codeforces gym 2013-2014 Samara SAU ACM ICPC Quarterfinal Qualification Contest
- 不是我想要的吗hbgnhk
- Learn By Doing & 随笔
- 大型网站负载均衡解决方法
- 随笔~愉悦的感觉
- Web 开发人员需知的 Web 缓存知识
- C/C++中如何获取数组的长度?
- 怎么样查询南昌市手机通话详单记录【百度安全认证QQ:179105557】
- 男友手机通话清单被删了如何恢复【百度安全认证QQ:179105557】