2017-10-23 NOIP模拟赛
叉叉
题目描述
现在有一个字符串,每个字母出现的次数均为偶数。接下来我们把第一次出现的字母a和第二次出现的a连一条线,第三次出现的和四次出现的字母a连一条线,第五次出现的和六次出现的字母a连一条线...对其他25个字母也做同样的操作。
现在我们想知道有多少对连线交叉。交叉的定义为一个连线的端点在另外一个连线的内部,另外一个端点在外部。
下图是一个例子,共有三对连线交叉(我们连线的时候,只能从字符串上方经过)。
输入格式
一行一个字符串。保证字符串均由小写字母组成,且每个字母出现次数为偶数次。
输出格式
一个整数,表示答案。
样例输入
abaazooabz
样例输出
3
数据范围
对于30% 的数据,字符串长度不超过50。
对于100% 的数据,字符串长度不超过100,000。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- using namespace std;
- int top,ans,cnt[],pos[],num[],a[];
- char s[];
- int main(){
- freopen("cross.in","r",stdin);freopen("cross.out","w",stdout);
- //freopen("Cola.txt","r",stdin);
- scanf("%s",s);
- int len=strlen(s);
- memset(pos,0x3f,sizeof(pos));
- for(int i=;i<len;i++){
- int now=s[i]-'a';
- num[now]++;
- if(num[now]%==){
- ans+=cnt[now];
- for(int j=;j<;j++){
- if(j==now)continue;
- if(pos[j]<pos[now])cnt[j]--;
- }
- pos[now]=0x7fffffff;
- cnt[pos[now]]=;
- }
- else {
- a[top]=now;
- pos[now]=top;
- cnt[now]=;
- top++;
- for(int j=;j<;j++){
- if(j==now)continue;
- if(pos[j]<pos[now])cnt[j]++;
- }
- }
- }
- printf("%d",ans);
- }
100分 栈模拟
跳跳虎回家
- #include<iostream>
- #include<cstdio>
- #include<cmath>
- #include<queue>
- #include<cstring>
- #define maxn 501
- using namespace std;
- int n,m,p,k,num,head[maxn],f[][];
- struct node{int to,pre,v,mark;}e[+];
- struct Node{
- int id,cnt,dis;
- bool operator < (const Node b)const{
- return dis>b.dis;
- }
- };
- Node make_Node(int id,int cnt,int dis){
- Node res;
- res.id=id;res.cnt=cnt;res.dis=dis;
- return res;
- }
- void Insert(int from,int to,int v,int mark){
- e[++num].to=to;
- e[num].v=v;
- e[num].mark=mark;
- e[num].pre=head[from];
- head[from]=num;
- }
- priority_queue<Node>q;
- void Dij(){
- q.push(make_Node(,,));
- memset(f,0x3f,sizeof(f));f[][]=;
- while(!q.empty()){
- Node now=q.top();int point=now.id,d=now.dis,c=now.cnt;
- q.pop();
- for(int i=head[point];i;i=e[i].pre){
- int to=e[i].to;
- if(e[i].mark==&&f[to][c]>f[point][c]+e[i].v){
- f[to][c]=f[point][c]+e[i].v;
- q.push(make_Node(to,c,f[to][c]));
- }
- if(c<k&&e[i].mark==&&f[to][c+]>f[point][c]+e[i].v){
- f[to][c+]=f[point][c]+e[i].v;
- q.push(make_Node(to,c+,f[to][c+]));
- }
- }
- }
- }
- int main(){
- //freopen("Cola.in","r",stdin);
- freopen("move.in","r",stdin);freopen("move.out","w",stdout);
- scanf("%d%d%d%d",&n,&m,&p,&k);
- int x,y,z;
- for(int i=;i<=m;i++){
- scanf("%d%d%d",&x,&y,&z);
- Insert(x,y,z,);
- }
- for(int i=;i<=p;i++){
- scanf("%d%d%d",&x,&y,&z);
- Insert(x,y,z,);
- }
- Dij();
- int ans=0x7fffffff;
- for(int i=;i<=min(k,p);i++){
- ans=min(ans,f[n][i]);
- }
- if(ans>){puts("-1");return ;}
- printf("%d",ans);
- }
80分 Dij+dp
- #include<iostream>
- #include<cstdio>
- #include<queue>
- #include<cstring>
- #define maxn 5010
- using namespace std;
- int n,m,p,k,l,r,mid;
- int num,head[maxn],num2,head2[maxn],dis[maxn];
- bool vis[maxn],ok[maxn],flag;
- struct node{
- int to,pre,v,mark;
- }e[maxn],e2[maxn];
- void Insert(int from,int to,int v,int mark){
- e[++num].to=to;
- e[num].v=v;
- e[num].pre=head[from];
- e[num].mark=mark;
- head[from]=num;
- }
- void Insert2(int from,int to,int v,int mark){
- e2[++num2].to=to;
- e2[num2].v=v;
- e2[num2].pre=head2[from];
- e2[num2].mark=mark;
- head2[from]=num2;
- }
- void Spfa(){
- queue<int>q;
- memset(dis,0x3f,sizeof(dis));
- memset(vis,,sizeof(vis));
- vis[]=;dis[]=;
- q.push();
- while(!q.empty()){
- int now=q.front();q.pop();vis[now]=;
- for(int i=head[now];i;i=e[i].pre){
- if(e[i].mark)continue;
- int to=e[i].to;
- if(dis[to]>dis[now]+e[i].v){
- dis[to]=dis[now]+e[i].v;
- if(!vis[to])vis[to]=,q.push(to);
- }
- }
- }
- }
- void dfs(int now,int d,int t){
- if(t>k)return;
- if(d>mid)return;
- if(now==n){flag=;return;}
- if(flag)return;
- for(int i=head[now];i;i=e[i].pre){
- int to=e[i].to;
- if(!ok[to])continue;
- if(!vis[to]){
- vis[to]=;
- dfs(to,d+e[i].v,t+e[i].mark);
- vis[to]=;
- }
- }
- }
- bool check(){
- flag=;
- memset(vis,,sizeof(vis));
- vis[]=;
- dfs(,,);
- if(flag)return ;
- else return ;
- }
- void bfs(){
- queue<int>q;
- q.push(n);ok[n]=;
- while(!q.empty()){
- int now=q.front();q.pop();
- for(int i=head2[now];i;i=e2[i].pre){
- int to=e2[i].to;
- if(!ok[to]){
- ok[to]=;
- q.push(to);
- }
- }
- }
- }
- int main(){
- //freopen("Cola.txt","r",stdin);
- freopen("move.in","r",stdin);freopen("move.out","w",stdout);
- scanf("%d%d%d%d",&n,&m,&p,&k);
- int x,y,z;
- for(int i=;i<=m;i++){
- scanf("%d%d%d",&x,&y,&z);
- Insert(x,y,z,);
- Insert2(y,x,z,);
- r+=z;
- }
- for(int j=;j<=p;j++){
- scanf("%d%d%d",&x,&y,&z);
- Insert(x,y,z,);
- Insert2(y,x,z,);
- r+=z;
- }
- if(k==){
- Spfa();
- if(dis[n]>=){puts("-1");return ;}
- printf("%d",dis[n]);return ;
- }
- else {
- bfs();
- if(!ok[]){puts("-1");return ;}
- int ans=-;
- while(l<=r){
- mid=(l+r)>>;
- if(check())ans=mid,r=mid-;
- else l=mid+;
- }
- printf("%d",ans);
- }
- }
95分 二分答案
- #include<iostream>
- #include<cstdio>
- #include<cmath>
- #include<queue>
- #include<cstring>
- #define maxn 501
- using namespace std;
- int n,m,p,k,num,head[maxn],f[][];
- bool vis[maxn][];
- struct node{int to,pre,v,mark;}e[+];
- struct Node{
- int id,cnt,dis;
- bool operator < (const Node b)const{
- return dis>b.dis;
- }
- };
- Node make_Node(int id,int cnt,int dis){
- Node res;
- res.id=id;res.cnt=cnt;res.dis=dis;
- return res;
- }
- void Insert(int from,int to,int v,int mark){
- e[++num].to=to;
- e[num].v=v;
- e[num].mark=mark;
- e[num].pre=head[from];
- head[from]=num;
- }
- priority_queue<Node>q;
- void Dij(){
- q.push(make_Node(,,));
- memset(f,0x3f,sizeof(f));f[][]=;
- while(!q.empty()){
- Node now=q.top();int point=now.id,d=now.dis,c=now.cnt;
- if(point==n)break;//非常有用的一句话
- q.pop();
- for(int i=head[point];i;i=e[i].pre){
- int to=e[i].to;
- if(e[i].mark==&&f[to][c]>f[point][c]+e[i].v){
- f[to][c]=f[point][c]+e[i].v;
- q.push(make_Node(to,c,f[to][c]));
- }
- if(c<k&&e[i].mark==&&f[to][c+]>f[point][c]+e[i].v){
- f[to][c+]=f[point][c]+e[i].v;
- q.push(make_Node(to,c+,f[to][c+]));
- }
- }
- }
- }
- int main(){
- //freopen("Cola.in","r",stdin);
- freopen("move.in","r",stdin);freopen("move.out","w",stdout);
- scanf("%d%d%d%d",&n,&m,&p,&k);
- int x,y,z;
- for(int i=;i<=m;i++){
- scanf("%d%d%d",&x,&y,&z);
- Insert(x,y,z,);
- }
- for(int i=;i<=p;i++){
- scanf("%d%d%d",&x,&y,&z);
- Insert(x,y,z,);
- }
- Dij();
- int ans=0x7fffffff;
- for(int i=;i<=min(k,p);i++){
- ans=min(ans,f[n][i]);
- }
- if(ans>){puts("-1");return ;}
- printf("%d",ans);
- }
100分 Dij+dp(一个有用的优化)
秀秀和哺噜国
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<queue>
- #define maxn 5010
- #define mod 786433
- using namespace std;
- int n,k,num,head[maxn],fal[maxn],sz[maxn],ans,can[maxn],c;
- bool vis[maxn],v[maxn];
- struct node{
- int to,pre,v;
- }e[maxn];
- void Insert(int from,int to,int id){
- e[id].to=to;
- e[id].pre=head[from];
- head[from]=id;
- num=max(num,id);
- }
- void Dfs(int now,int father){
- sz[now]=;
- for(int i=head[now];i;i=e[i].pre){
- int to=e[i].to;
- if(to==father)continue;
- fal[to]=i;
- Dfs(to,now);
- sz[now]+=sz[to];
- }
- }
- int bfs(int x){
- int res=;
- queue<int>q;
- q.push(x);
- vis[x]=;
- while(!q.empty()){
- int now=q.front();q.pop();
- for(int i=head[now];i;i=e[i].pre){
- if(e[i].v!=)continue;
- int to=e[i].to;
- if(!vis[to]){
- vis[to]=;
- q.push(to);
- res++;
- }
- }
- }
- return res;
- }
- bool check(){
- memset(vis,,sizeof(vis));
- for(int i=;i<=n;i++){
- if(!vis[i]){
- if(bfs(i)<k)return ;
- }
- }
- return ;
- }
- void dfs(int pos){
- if(pos>c){
- //for(int i=1;i<=num;i++)cout<<i<<' '<<e[i].v<<endl;cout<<endl;
- if(check()){
- ans++;
- if(ans>=mod)ans-=mod;
- }
- return;
- }
- dfs(pos+);
- int w=(can[pos]>=n?(can[pos]-n+):(can[pos]+n-));
- e[can[pos]].v=;
- e[w].v=;
- dfs(pos+);
- e[can[pos]].v=;
- e[w].v=;
- }
- int main(){
- //freopen("Cola.in","r",stdin);
- freopen("cut.in","r",stdin);freopen("cut.out","w",stdout);
- scanf("%d%d",&n,&k);
- int x,y;
- for(int i=;i<n;i++){
- scanf("%d%d",&x,&y);
- Insert(x,y,i);Insert(y,x,i+n-);
- }
- Dfs(,);
- int sum=;
- for(int i=;i<=n;i++)
- if(sz[i]<k){
- //e[fal[i]].v=1;
- int w=(fal[i]>=n?fal[i]-n+:fal[i]+n-);
- //e[w].v=1;
- v[fal[i]]=v[w]=;
- sum++;
- }
- for(int i=;i<=num;i++){
- if(v[i]==){
- can[++c]=i;
- int w=(i>=n?i-n+:i+n-);
- v[w]=;
- v[i]=;
- }
- }
- dfs();
- printf("%d",ans);
- return ;
- }
20分 暴力
- #include<cstdio>
- #include<cstdlib>
- #define N 5555
- #define M 786433
- using namespace std;
- typedef long long LL;
- struct edge
- {
- int t,n;
- }e[N*];
- LL h[N],size[N],f[N][N],g[N],cnt[N];
- int n,K,tote;
- void add(int u,int v)
- {
- e[++tote].t=v;
- e[tote].n=h[u];
- h[u]=tote;
- return ;
- }
- void dfs(int u,int fa)
- {
- size[u]++; f[u][]=;
- for (int i=h[u];i;i=e[i].n)
- {
- int v=e[i].t;
- if (v==fa) continue;
- dfs(v,u);
- for (int j=;j<=size[u]+size[v];j++) g[j]=;
- for (int j=;j<=size[u];j++) g[j]=cnt[v]*f[u][j]%M;
- for (int j=;j<=size[u];j++)
- for (int k=;k<=size[v];k++) g[j+k]=(g[j+k]+f[u][j]*f[v][k]%M)%M;
- for (int j=;j<=size[u]+size[v];j++) f[u][j]=g[j];
- size[u]+=size[v];
- }
- for (int i=K;i<=size[u];i++) cnt[u]=(cnt[u]+f[u][i])%M;
- return ;
- }
- int main()
- {
- freopen("cut.in","r",stdin);
- freopen("cut.out","w",stdout);
- scanf("%d %d",&n,&K);
- for (int i=;i<n;i++)
- {
- int u,v;
- scanf("%d %d",&u,&v);
- add(u,v); add(v,u);
- }
- dfs(,);
- printf("%d\n",cnt[]);
- fclose(stdin);
- fclose(stdout);
- return ;
- }
100分 树形背包
2017-10-23 NOIP模拟赛的更多相关文章
- 2017 10.25 NOIP模拟赛
期望得分:100+40+100=240 实际得分:50+40+20=110 T1 start取了min没有用,w(゚Д゚)w O(≧口≦)O T3 代码3个bug :数组开小了,一个细节没注意, ...
- 10.17 NOIP模拟赛
目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...
- 10.16 NOIP模拟赛
目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...
- 2018.10.16 NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...
- 2017.5.27 NOIP模拟赛(hzwer2014-5-16 NOIP模拟赛)
期望得分:100+100+60+30=290 实际得分:100+20+60+0=180 当务之急:提高一次正确率 Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一 ...
- 2016.10.30 NOIP模拟赛 day2 PM 整理
满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...
- 2016.10.30 NOIP模拟赛 day2 AM 整理
题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分 2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...
- 2017.6.11 NOIP模拟赛
题目链接: http://files.cnblogs.com/files/TheRoadToTheGold/2017-6.11NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9B.zip 期 ...
- 2018.10.03 NOIP+ 模拟赛 解题报告
得分: \(30+5+0=35\)(考得真不咋滴) \(T1\):奥义商店(点此看题面) 以为很简单,对着这题想了一个多小时,最后果断打了个暴力交了... ... 看完题解发现其实也不是很难. 对于\ ...
- 2018.10.30 NOIp模拟赛 T1 改造二叉树
[题目描述] 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论 ...
随机推荐
- UVA 10158 War(并查集)
//思路详见课本 P 214 页 思路:直接用并查集,set [ k ] 存 k 的朋友所在集合的代表元素,set [ k + n ] 存 k 的敌人 所在集合的代表元素. #include< ...
- hadoop_学习_02_Hadoop环境搭建(单机)
一.环境准备 1.说明 hadoop的下载来源有: 官方版本:http://archive.apache.org/dist/hadoop/ CDH版本:http://archive.cloudera. ...
- Linux-MySQL主从配置
1. MySQL主从原理以及应用场景MySQL的Replication原理非常简单,总结一下:每个从仅可以设置一个主.主在执行sql之后,记录二进制log文件(bin-log).从连接主,并从主获取b ...
- NOI 模拟赛 #2
得分非常惨惨,半个小时写的纯暴力 70 分竟然拿了 rank 1... 如果 OYJason 和 wxjor 在可能会被爆踩吧 嘤 T1 欧拉子图 给一个无向图,如果一个边集的导出子图是一个欧拉回路, ...
- MySQL_西安11月销售昨日未上架的产品_20161212
#C034西安11月销售昨日未上架的产品 SELECT 城市,a.订单日期,a.客户数,a.订单数,b.产品数,a.金额,c.销售确认额,c.毛利额,c.毛利率 FROM ( SELECT 城市,订 ...
- JSONP -- 跨域数据交互协议
一.概念 ①传统Ajax:交互的数据格式——自定义字符串或XML描述: 跨域——通过服务器端代理解决. ②如今最优方案:使用JSON格式来传输数据,使用JSONP来跨域. ③JSON:一种数据交换格式 ...
- android开发 MyEclipse下测试连接MySQL数据库
1.首先要加载MySQL驱动包. 步骤:右击项目找到build path->configure build path->libraries——>add External JARs添加 ...
- MySQL读取各个my.cnf配置文件的先后顺序是:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 其他自定义路径下的my.cnf,例如:/data/mysql/y ...
- Python:列表反序和解析
1)列表反序 A.list.reverse():将列表反序: l = [1, 2, 3, 4, 5] print(l.reverse()) -->[5, 4, 3, 2, 1] B.l.[::- ...
- 第 六 课 GO语言常量
http://www.runoob.com/go/go-constants.html 一 常量 是一个简单值的标识符,在程序运行时,不会被修改的量. 常量中的数据类型只可以是布尔型.数字型(整数型.浮 ...