叉叉

题目描述

现在有一个字符串,每个字母出现的次数均为偶数。接下来我们把第一次出现的字母a和第二次出现的a连一条线,第三次出现的和四次出现的字母a连一条线,第五次出现的和六次出现的字母a连一条线...对其他25个字母也做同样的操作。

现在我们想知道有多少对连线交叉。交叉的定义为一个连线的端点在另外一个连线的内部,另外一个端点在外部。

下图是一个例子,共有三对连线交叉(我们连线的时候,只能从字符串上方经过)。

输入格式

一行一个字符串。保证字符串均由小写字母组成,且每个字母出现次数为偶数次。

输出格式

一个整数,表示答案。

样例输入

abaazooabz

样例输出

3

数据范围

对于30% 的数据,字符串长度不超过50。

对于100% 的数据,字符串长度不超过100,000。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. int top,ans,cnt[],pos[],num[],a[];
  6. char s[];
  7. int main(){
  8. freopen("cross.in","r",stdin);freopen("cross.out","w",stdout);
  9. //freopen("Cola.txt","r",stdin);
  10. scanf("%s",s);
  11. int len=strlen(s);
  12. memset(pos,0x3f,sizeof(pos));
  13. for(int i=;i<len;i++){
  14. int now=s[i]-'a';
  15. num[now]++;
  16. if(num[now]%==){
  17. ans+=cnt[now];
  18. for(int j=;j<;j++){
  19. if(j==now)continue;
  20. if(pos[j]<pos[now])cnt[j]--;
  21. }
  22. pos[now]=0x7fffffff;
  23. cnt[pos[now]]=;
  24. }
  25. else {
  26. a[top]=now;
  27. pos[now]=top;
  28. cnt[now]=;
  29. top++;
  30. for(int j=;j<;j++){
  31. if(j==now)continue;
  32. if(pos[j]<pos[now])cnt[j]++;
  33. }
  34. }
  35. }
  36. printf("%d",ans);
  37. }

100分 栈模拟

跳跳虎回家

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<queue>
  5. #include<cstring>
  6. #define maxn 501
  7. using namespace std;
  8. int n,m,p,k,num,head[maxn],f[][];
  9. struct node{int to,pre,v,mark;}e[+];
  10. struct Node{
  11. int id,cnt,dis;
  12. bool operator < (const Node b)const{
  13. return dis>b.dis;
  14. }
  15. };
  16. Node make_Node(int id,int cnt,int dis){
  17. Node res;
  18. res.id=id;res.cnt=cnt;res.dis=dis;
  19. return res;
  20. }
  21. void Insert(int from,int to,int v,int mark){
  22. e[++num].to=to;
  23. e[num].v=v;
  24. e[num].mark=mark;
  25. e[num].pre=head[from];
  26. head[from]=num;
  27. }
  28. priority_queue<Node>q;
  29. void Dij(){
  30. q.push(make_Node(,,));
  31. memset(f,0x3f,sizeof(f));f[][]=;
  32. while(!q.empty()){
  33. Node now=q.top();int point=now.id,d=now.dis,c=now.cnt;
  34. q.pop();
  35. for(int i=head[point];i;i=e[i].pre){
  36. int to=e[i].to;
  37. if(e[i].mark==&&f[to][c]>f[point][c]+e[i].v){
  38. f[to][c]=f[point][c]+e[i].v;
  39. q.push(make_Node(to,c,f[to][c]));
  40. }
  41. if(c<k&&e[i].mark==&&f[to][c+]>f[point][c]+e[i].v){
  42. f[to][c+]=f[point][c]+e[i].v;
  43. q.push(make_Node(to,c+,f[to][c+]));
  44. }
  45. }
  46. }
  47. }
  48. int main(){
  49. //freopen("Cola.in","r",stdin);
  50. freopen("move.in","r",stdin);freopen("move.out","w",stdout);
  51. scanf("%d%d%d%d",&n,&m,&p,&k);
  52. int x,y,z;
  53. for(int i=;i<=m;i++){
  54. scanf("%d%d%d",&x,&y,&z);
  55. Insert(x,y,z,);
  56. }
  57. for(int i=;i<=p;i++){
  58. scanf("%d%d%d",&x,&y,&z);
  59. Insert(x,y,z,);
  60. }
  61. Dij();
  62. int ans=0x7fffffff;
  63. for(int i=;i<=min(k,p);i++){
  64. ans=min(ans,f[n][i]);
  65. }
  66. if(ans>){puts("-1");return ;}
  67. printf("%d",ans);
  68. }

80分 Dij+dp

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<queue>
  4. #include<cstring>
  5. #define maxn 5010
  6. using namespace std;
  7. int n,m,p,k,l,r,mid;
  8. int num,head[maxn],num2,head2[maxn],dis[maxn];
  9. bool vis[maxn],ok[maxn],flag;
  10. struct node{
  11. int to,pre,v,mark;
  12. }e[maxn],e2[maxn];
  13. void Insert(int from,int to,int v,int mark){
  14. e[++num].to=to;
  15. e[num].v=v;
  16. e[num].pre=head[from];
  17. e[num].mark=mark;
  18. head[from]=num;
  19. }
  20. void Insert2(int from,int to,int v,int mark){
  21. e2[++num2].to=to;
  22. e2[num2].v=v;
  23. e2[num2].pre=head2[from];
  24. e2[num2].mark=mark;
  25. head2[from]=num2;
  26. }
  27. void Spfa(){
  28. queue<int>q;
  29. memset(dis,0x3f,sizeof(dis));
  30. memset(vis,,sizeof(vis));
  31. vis[]=;dis[]=;
  32. q.push();
  33. while(!q.empty()){
  34. int now=q.front();q.pop();vis[now]=;
  35. for(int i=head[now];i;i=e[i].pre){
  36. if(e[i].mark)continue;
  37. int to=e[i].to;
  38. if(dis[to]>dis[now]+e[i].v){
  39. dis[to]=dis[now]+e[i].v;
  40. if(!vis[to])vis[to]=,q.push(to);
  41. }
  42. }
  43. }
  44. }
  45. void dfs(int now,int d,int t){
  46. if(t>k)return;
  47. if(d>mid)return;
  48. if(now==n){flag=;return;}
  49. if(flag)return;
  50. for(int i=head[now];i;i=e[i].pre){
  51. int to=e[i].to;
  52. if(!ok[to])continue;
  53. if(!vis[to]){
  54. vis[to]=;
  55. dfs(to,d+e[i].v,t+e[i].mark);
  56. vis[to]=;
  57. }
  58. }
  59. }
  60. bool check(){
  61. flag=;
  62. memset(vis,,sizeof(vis));
  63. vis[]=;
  64. dfs(,,);
  65. if(flag)return ;
  66. else return ;
  67. }
  68. void bfs(){
  69. queue<int>q;
  70. q.push(n);ok[n]=;
  71. while(!q.empty()){
  72. int now=q.front();q.pop();
  73. for(int i=head2[now];i;i=e2[i].pre){
  74. int to=e2[i].to;
  75. if(!ok[to]){
  76. ok[to]=;
  77. q.push(to);
  78. }
  79. }
  80. }
  81. }
  82. int main(){
  83. //freopen("Cola.txt","r",stdin);
  84. freopen("move.in","r",stdin);freopen("move.out","w",stdout);
  85. scanf("%d%d%d%d",&n,&m,&p,&k);
  86. int x,y,z;
  87. for(int i=;i<=m;i++){
  88. scanf("%d%d%d",&x,&y,&z);
  89. Insert(x,y,z,);
  90. Insert2(y,x,z,);
  91. r+=z;
  92. }
  93. for(int j=;j<=p;j++){
  94. scanf("%d%d%d",&x,&y,&z);
  95. Insert(x,y,z,);
  96. Insert2(y,x,z,);
  97. r+=z;
  98. }
  99. if(k==){
  100. Spfa();
  101. if(dis[n]>=){puts("-1");return ;}
  102. printf("%d",dis[n]);return ;
  103. }
  104. else {
  105. bfs();
  106. if(!ok[]){puts("-1");return ;}
  107. int ans=-;
  108. while(l<=r){
  109. mid=(l+r)>>;
  110. if(check())ans=mid,r=mid-;
  111. else l=mid+;
  112. }
  113. printf("%d",ans);
  114. }
  115. }

95分 二分答案

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<queue>
  5. #include<cstring>
  6. #define maxn 501
  7. using namespace std;
  8. int n,m,p,k,num,head[maxn],f[][];
  9. bool vis[maxn][];
  10. struct node{int to,pre,v,mark;}e[+];
  11. struct Node{
  12. int id,cnt,dis;
  13. bool operator < (const Node b)const{
  14. return dis>b.dis;
  15. }
  16. };
  17. Node make_Node(int id,int cnt,int dis){
  18. Node res;
  19. res.id=id;res.cnt=cnt;res.dis=dis;
  20. return res;
  21. }
  22. void Insert(int from,int to,int v,int mark){
  23. e[++num].to=to;
  24. e[num].v=v;
  25. e[num].mark=mark;
  26. e[num].pre=head[from];
  27. head[from]=num;
  28. }
  29. priority_queue<Node>q;
  30. void Dij(){
  31. q.push(make_Node(,,));
  32. memset(f,0x3f,sizeof(f));f[][]=;
  33. while(!q.empty()){
  34. Node now=q.top();int point=now.id,d=now.dis,c=now.cnt;
  35. if(point==n)break;//非常有用的一句话
  36. q.pop();
  37. for(int i=head[point];i;i=e[i].pre){
  38. int to=e[i].to;
  39. if(e[i].mark==&&f[to][c]>f[point][c]+e[i].v){
  40. f[to][c]=f[point][c]+e[i].v;
  41. q.push(make_Node(to,c,f[to][c]));
  42. }
  43. if(c<k&&e[i].mark==&&f[to][c+]>f[point][c]+e[i].v){
  44. f[to][c+]=f[point][c]+e[i].v;
  45. q.push(make_Node(to,c+,f[to][c+]));
  46. }
  47. }
  48. }
  49. }
  50. int main(){
  51. //freopen("Cola.in","r",stdin);
  52. freopen("move.in","r",stdin);freopen("move.out","w",stdout);
  53. scanf("%d%d%d%d",&n,&m,&p,&k);
  54. int x,y,z;
  55. for(int i=;i<=m;i++){
  56. scanf("%d%d%d",&x,&y,&z);
  57. Insert(x,y,z,);
  58. }
  59. for(int i=;i<=p;i++){
  60. scanf("%d%d%d",&x,&y,&z);
  61. Insert(x,y,z,);
  62. }
  63. Dij();
  64. int ans=0x7fffffff;
  65. for(int i=;i<=min(k,p);i++){
  66. ans=min(ans,f[n][i]);
  67. }
  68. if(ans>){puts("-1");return ;}
  69. printf("%d",ans);
  70. }

100分 Dij+dp(一个有用的优化)

秀秀和哺噜国

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. #define maxn 5010
  6. #define mod 786433
  7. using namespace std;
  8. int n,k,num,head[maxn],fal[maxn],sz[maxn],ans,can[maxn],c;
  9. bool vis[maxn],v[maxn];
  10. struct node{
  11. int to,pre,v;
  12. }e[maxn];
  13. void Insert(int from,int to,int id){
  14. e[id].to=to;
  15. e[id].pre=head[from];
  16. head[from]=id;
  17. num=max(num,id);
  18. }
  19. void Dfs(int now,int father){
  20. sz[now]=;
  21. for(int i=head[now];i;i=e[i].pre){
  22. int to=e[i].to;
  23. if(to==father)continue;
  24. fal[to]=i;
  25. Dfs(to,now);
  26. sz[now]+=sz[to];
  27. }
  28. }
  29. int bfs(int x){
  30. int res=;
  31. queue<int>q;
  32. q.push(x);
  33. vis[x]=;
  34. while(!q.empty()){
  35. int now=q.front();q.pop();
  36. for(int i=head[now];i;i=e[i].pre){
  37. if(e[i].v!=)continue;
  38. int to=e[i].to;
  39. if(!vis[to]){
  40. vis[to]=;
  41. q.push(to);
  42. res++;
  43. }
  44. }
  45. }
  46. return res;
  47. }
  48. bool check(){
  49. memset(vis,,sizeof(vis));
  50. for(int i=;i<=n;i++){
  51. if(!vis[i]){
  52. if(bfs(i)<k)return ;
  53. }
  54. }
  55. return ;
  56. }
  57. void dfs(int pos){
  58. if(pos>c){
  59. //for(int i=1;i<=num;i++)cout<<i<<' '<<e[i].v<<endl;cout<<endl;
  60. if(check()){
  61. ans++;
  62. if(ans>=mod)ans-=mod;
  63. }
  64. return;
  65. }
  66. dfs(pos+);
  67. int w=(can[pos]>=n?(can[pos]-n+):(can[pos]+n-));
  68. e[can[pos]].v=;
  69. e[w].v=;
  70. dfs(pos+);
  71. e[can[pos]].v=;
  72. e[w].v=;
  73. }
  74. int main(){
  75. //freopen("Cola.in","r",stdin);
  76. freopen("cut.in","r",stdin);freopen("cut.out","w",stdout);
  77. scanf("%d%d",&n,&k);
  78. int x,y;
  79. for(int i=;i<n;i++){
  80. scanf("%d%d",&x,&y);
  81. Insert(x,y,i);Insert(y,x,i+n-);
  82. }
  83. Dfs(,);
  84. int sum=;
  85. for(int i=;i<=n;i++)
  86. if(sz[i]<k){
  87. //e[fal[i]].v=1;
  88. int w=(fal[i]>=n?fal[i]-n+:fal[i]+n-);
  89. //e[w].v=1;
  90. v[fal[i]]=v[w]=;
  91. sum++;
  92. }
  93. for(int i=;i<=num;i++){
  94. if(v[i]==){
  95. can[++c]=i;
  96. int w=(i>=n?i-n+:i+n-);
  97. v[w]=;
  98. v[i]=;
  99. }
  100. }
  101. dfs();
  102. printf("%d",ans);
  103. return ;
  104. }

20分 暴力

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #define N 5555
  4. #define M 786433
  5. using namespace std;
  6. typedef long long LL;
  7. struct edge
  8. {
  9. int t,n;
  10. }e[N*];
  11. LL h[N],size[N],f[N][N],g[N],cnt[N];
  12. int n,K,tote;
  13. void add(int u,int v)
  14. {
  15. e[++tote].t=v;
  16. e[tote].n=h[u];
  17. h[u]=tote;
  18. return ;
  19. }
  20. void dfs(int u,int fa)
  21. {
  22. size[u]++; f[u][]=;
  23. for (int i=h[u];i;i=e[i].n)
  24. {
  25. int v=e[i].t;
  26. if (v==fa) continue;
  27. dfs(v,u);
  28. for (int j=;j<=size[u]+size[v];j++) g[j]=;
  29. for (int j=;j<=size[u];j++) g[j]=cnt[v]*f[u][j]%M;
  30. for (int j=;j<=size[u];j++)
  31. for (int k=;k<=size[v];k++) g[j+k]=(g[j+k]+f[u][j]*f[v][k]%M)%M;
  32. for (int j=;j<=size[u]+size[v];j++) f[u][j]=g[j];
  33. size[u]+=size[v];
  34. }
  35. for (int i=K;i<=size[u];i++) cnt[u]=(cnt[u]+f[u][i])%M;
  36. return ;
  37. }
  38. int main()
  39. {
  40. freopen("cut.in","r",stdin);
  41. freopen("cut.out","w",stdout);
  42. scanf("%d %d",&n,&K);
  43. for (int i=;i<n;i++)
  44. {
  45. int u,v;
  46. scanf("%d %d",&u,&v);
  47. add(u,v); add(v,u);
  48. }
  49. dfs(,);
  50. printf("%d\n",cnt[]);
  51. fclose(stdin);
  52. fclose(stdout);
  53. return ;
  54. }

100分 树形背包

2017-10-23 NOIP模拟赛的更多相关文章

  1. 2017 10.25 NOIP模拟赛

    期望得分:100+40+100=240 实际得分:50+40+20=110 T1 start取了min没有用,w(゚Д゚)w    O(≧口≦)O T3 代码3个bug :数组开小了,一个细节没注意, ...

  2. 10.17 NOIP模拟赛

    目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...

  3. 10.16 NOIP模拟赛

    目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...

  4. 2018.10.16 NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...

  5. 2017.5.27 NOIP模拟赛(hzwer2014-5-16 NOIP模拟赛)

    期望得分:100+100+60+30=290 实际得分:100+20+60+0=180 当务之急:提高一次正确率 Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一 ...

  6. 2016.10.30 NOIP模拟赛 day2 PM 整理

    满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...

  7. 2016.10.30 NOIP模拟赛 day2 AM 整理

    题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分  2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...

  8. 2017.6.11 NOIP模拟赛

    题目链接: http://files.cnblogs.com/files/TheRoadToTheGold/2017-6.11NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9B.zip 期 ...

  9. 2018.10.03 NOIP+ 模拟赛 解题报告

    得分: \(30+5+0=35\)(考得真不咋滴) \(T1\):奥义商店(点此看题面) 以为很简单,对着这题想了一个多小时,最后果断打了个暴力交了... ... 看完题解发现其实也不是很难. 对于\ ...

  10. 2018.10.30 NOIp模拟赛 T1 改造二叉树

    [题目描述] 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论 ...

随机推荐

  1. UVA 10158 War(并查集)

    //思路详见课本 P 214 页 思路:直接用并查集,set [ k ]  存 k 的朋友所在集合的代表元素,set [ k + n ] 存 k  的敌人 所在集合的代表元素. #include< ...

  2. hadoop_学习_02_Hadoop环境搭建(单机)

    一.环境准备 1.说明 hadoop的下载来源有: 官方版本:http://archive.apache.org/dist/hadoop/ CDH版本:http://archive.cloudera. ...

  3. Linux-MySQL主从配置

    1. MySQL主从原理以及应用场景MySQL的Replication原理非常简单,总结一下:每个从仅可以设置一个主.主在执行sql之后,记录二进制log文件(bin-log).从连接主,并从主获取b ...

  4. NOI 模拟赛 #2

    得分非常惨惨,半个小时写的纯暴力 70 分竟然拿了 rank 1... 如果 OYJason 和 wxjor 在可能会被爆踩吧 嘤 T1 欧拉子图 给一个无向图,如果一个边集的导出子图是一个欧拉回路, ...

  5. MySQL_西安11月销售昨日未上架的产品_20161212

    #C034西安11月销售昨日未上架的产品  SELECT 城市,a.订单日期,a.客户数,a.订单数,b.产品数,a.金额,c.销售确认额,c.毛利额,c.毛利率 FROM ( SELECT 城市,订 ...

  6. JSONP -- 跨域数据交互协议

    一.概念 ①传统Ajax:交互的数据格式——自定义字符串或XML描述: 跨域——通过服务器端代理解决. ②如今最优方案:使用JSON格式来传输数据,使用JSONP来跨域. ③JSON:一种数据交换格式 ...

  7. android开发 MyEclipse下测试连接MySQL数据库

    1.首先要加载MySQL驱动包. 步骤:右击项目找到build path->configure build path->libraries——>add External JARs添加 ...

  8. MySQL读取各个my.cnf配置文件的先后顺序是:

    /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 其他自定义路径下的my.cnf,例如:/data/mysql/y ...

  9. Python:列表反序和解析

    1)列表反序 A.list.reverse():将列表反序: l = [1, 2, 3, 4, 5] print(l.reverse()) -->[5, 4, 3, 2, 1] B.l.[::- ...

  10. 第 六 课 GO语言常量

    http://www.runoob.com/go/go-constants.html 一 常量 是一个简单值的标识符,在程序运行时,不会被修改的量. 常量中的数据类型只可以是布尔型.数字型(整数型.浮 ...