10.23NOIP模拟题
叉叉
题目描述
现在有一个字符串,每个字母出现的次数均为偶数。接下来我们把第一次出现的字母 a 和第二
次出现的 a 连一条线,第三次出现的和四次出现的字母 a 连一条线,第五次出现的和六次出现
的字母 a 连一条线...对其他 25 个字母也做同样的操作。
现在我们想知道有多少对连线交叉。交叉的定义为一个连线的端点在另外一个连线的内部,另
外一个端点在外部。
下图是一个例子,共有三对连线交叉(我们连线的时候,只能从字符串上方经过)。
输入格式
题目名称 叉叉
程序文件名 cross
输入文件名 cross.in
输出文件名 cross.out
每个测试点时限 1 秒
内存限制 128MB
测试点数目 10
每个测试点分值 10
是否有部分分 无
试题类型 传统
一行一个字符串。保证字符串均由小写字母组成,且每个字母出现次数为偶数次。
输出格式
一个整数,表示答案。
样例输入
abaazooabz
样例输出
3
数据范围
对于 30% 的数据,字符串长度不超过 50。
对于 100% 的数据,字符串长度不超过 100,000。
/*
因为是两个相同的为一个区间,想到用栈来实现
开一个vis表示元素是否在栈中出现,开两个栈,遇到出现过的元素就把两个相同元素中间的那些倒到另一个栈中
更新答案加上两个相同元素中间元素换了几次栈
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<stack> #define N 100007 using namespace std;
int n,ans;
char s[N];
map<char,bool>vis;
map<char,int>val;
stack<char>st1;
stack<char>st2; int main()
{
freopen("cross.in","r",stdin);
freopen("cross.out","w",stdout);
scanf("%s",s);n=strlen(s);
for(int i=;i<n;i++)
{
if(!vis[s[i]]) val[s[i]]=;
if(st1.empty()) st1.push(s[i]),vis[s[i]]=;
else
{
if(!st1.empty() && st1.top()==s[i])
{
vis[s[i]]=;ans+=val[s[i]];st1.pop();continue;
}
else if(st1.top()!=s[i] && !vis[s[i]])
{
vis[s[i]]=;st1.push(s[i]);continue;
}
else if(vis[s[i]] && !st1.empty())
{
while(st1.top()!=s[i])
{
int u=st1.top();st1.pop();
st2.push(u);val[u]++;
}
st1.pop();vis[s[i]]=;ans+=val[s[i]];val[s[i]]=;
while(!st1.empty()) st2.push(st1.top()),st1.pop();
while(!st2.empty())
{
int u=st2.top();st2.pop();
st1.push(u);
}
}
}
}
printf("%d\n",ans);
fclose(stdin);fclose(stdout);
return ;
}
跳跳虎回家
英⽂名称: move
时间限制: 1s
空间限制: 256M
题⽬描述
跳跳虎在外⾯出去玩忘了时间,现在他需要在最短的时间内赶回家。
跳跳虎所在的世界可以抽象成⼀个含有 个点的图(点编号从 到 ),跳跳虎现在在 号点,跳跳虎的家在 号点。
图上⼀共有 条单向边,通过每条边有固定的时间花费。
同时,还存在若⼲个单向传送通道,传送通道也有其时间花费。
传送通道⼀般来说⽐普通的道路更快,但是跳跳虎最多只能使⽤ 次。
跳跳虎想知道他回到家的最⼩时间消耗是多少。
输⼊格式
第⼀⾏输⼊ 个整数 ( 表⽰点数, 表⽰普通道路的数量, 表⽰传送通道的数量, 表⽰跳跳虎最多使⽤ 次传送通道)
接下来 ⾏每⾏ 个整数 ,表⽰有⼀条从 到 ,时间花费为 的普通道路( )
接下来 ⾏每⾏ 个整数 ,表⽰有⼀条从 到 ,时间花费为 的传送通道( )
输出格式
输出⼀⾏⼀个整数表⽰最⼩时间消耗,如果没法回到家输出 。
样例输⼊
5 5 2 1
1 2 1
1 3 2
2 4 2
3 4 3
4 5 4
1 4 1
2 5 1
样例输出
2
数据范围和约定
对于 的数据,
对于另外 的数据,
对于 的数据,
n 1 n 1 n
m
k
4 n,m,q,k n m q k k
m 3 u,v,w u v w 1 ≤ u,v ≤ n,1 ≤ w ≤ 10 3
q 3 x,y,z x y z 1 ≤ x,y ≤ n,1 ≤ z ≤ 10 3
−1
30% 1 ≤ n ≤ 500,0 ≤ m,q ≤ 2000,k = 0
30% 1 ≤ n ≤ 500,0 ≤ m,q ≤ 2000,k = 1
100% 1 ≤ n ≤ 500,0 ≤ m,q ≤ 2000,0 ≤ k ≤ 10 9
/*
类似分层图最短路
堆优化dij,dis[i][j]表示到i这个点用了j次通道的最短距离
*/
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm> #define N 501
#define M 2001 using namespace std;
int n,m,g,k;
int front[N],to[M<<],nxt[M<<],val[M<<],tot;
bool fly[M<<];
int DIS[N][]; struct node
{
int tim,dis,num;
bool operator < (node p) const{
return dis>p.dis;
}
}cur,nt;
priority_queue<node>q; void read(int &x)
{
x=;
char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)){x=x*+c-'';c=getchar();}
} void add(int u,int v,int w,bool fl)
{
to[++tot]=v;
nxt[tot]=front[u];
front[u]=tot;
val[tot]=w;
fly[tot]=fl;
} inline void init()
{
read(n);read(m);read(g);read(k);
int u,v,w;k=min(g,k);
while(m--)
{
read(u);read(v);read(w);add(u,v,w,);
}
while(g--)
{
read(u);read(v);read(w);add(u,v,w,);
}
} void dijkstra()
{
memset(DIS,,sizeof(DIS));
cur.dis=;cur.num=;cur.tim=;
DIS[][]=;q.push(cur);
while(!q.empty())
{
cur=q.top();q.pop();
if(cur.num==n)
{
printf("%d",cur.dis);return;
}
if(DIS[cur.num][cur.tim]!=cur.dis) continue;
for(int i=front[cur.num]; i; i=nxt[i])
{
if(DIS[to[i]][cur.tim+fly[i]]<cur.dis+val[i]) continue;
if(cur.tim+fly[i]>k) continue;
DIS[to[i]][cur.tim+fly[i]]=cur.dis+val[i];
nt.dis=cur.dis+val[i];nt.tim=cur.tim+fly[i];nt.num=to[i];
q.push(nt);
}
}
printf("-1");
} int main()
{
freopen("move.in","r",stdin);
freopen("move.out","w",stdout);
init();dijkstra();
return ;
}
/*
51nod 算法马拉松3 Tree
树形dp f[i][j]表示以i为根,根所在联通快为j的方案数
转移的时候把i的子树一颗一颗加到i中,n^3
枚举时常数优化,降至n^2
*/
#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 ;
}
10.23NOIP模拟题的更多相关文章
- 2018.10.23NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 50 + (10 \sim 50)\) 实际得分:\(100 + 10 + 50\) 这可能是我打的最懵逼的一场考试没有之一.. T1两个小时才做出来也是醉了. T ...
- 10.13NOIP模拟题
/* 容斥原理 考虑到a[i]要么不会太大,要么就对答案贡献很小 dfs即可 */ #include<bits/stdc++.h> #define ll long long #define ...
- 10.9NOIP模拟题
/* big模拟 细节不少 remove表示这个玩意儿在这一秒有没有移动 注意在一秒内所有小葱一起移动,所以如果一个一个处理 别忘了“错位”这种情况 */ #include<iostream&g ...
- 10.12NOIP模拟题(2)
/* 有谁知道这道题结论是怎么来的? 晚上问问学数学的孩子23333 */ #include<iostream> #include<cstdio> #include<cs ...
- 10.12NOIP模拟题(1)
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #defin ...
- 10.11NOIP模拟题(3)
/* 可以看出,对于一段区间[L,R]如果统计了答案 若a[L]<a[R],那么当右端点往左移时答案不会更优,a[R]>a[L]同理 所以两个指针分别从头尾往中间扫那边小移哪边即可. */ ...
- 10.11NOIP模拟题(2)
/* string水过 */ #include<bits/stdc++.h> #define N 1001 using namespace std; int n,x,y,m,pre; st ...
- poj 1008:Maya Calendar(模拟题,玛雅日历转换)
Maya Calendar Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 64795 Accepted: 19978 D ...
- poj 1888 Crossword Answers 模拟题
Crossword Answers Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 869 Accepted: 405 D ...
随机推荐
- POJ 1679 判最小生成树的不唯一性 或 利用次小生成树求解
题目大意: 给定一个无向图,寻找它的最小生成树,如果仅有一种最小生成树,输出所有边的和,否则输出unique! 根据kruscal原理来说,每次不断取尽可能小的边不断添加入最小生成树中,那么可知如果所 ...
- [luoguP1015] 回文数(模拟 + 高精度?)
传送门 类似高精的操作... 代码 #include <cstdio> #include <cstring> #include <iostream> #define ...
- noip模拟赛 集合
分析:感觉像是贪心,再看数据范围这么大,肯定是贪心没错.但是要怎么贪呢?主要的思想是让每次往上加的数尽量多,肯定要先把0分裂,如果能正好一起跳到最终状态就好.举个例子:5,3,2,1,最大值比次大值大 ...
- restful(3):认证、权限、频率 & 解析器、路由控制、分页、渲染器、版本
models.py中: class UserInfo(models.Model): name = models.CharField(max_length=32) psw = models.CharFi ...
- [thrift] thrift基本原理及使用
参考文章RPC 基本原理与 Apach Thrift 初体验 RPC基本原理 RPC(Remote Procedure Call),远程过程调用,大部分的RPC框架都遵循如下三个开发步骤: 1. 定义 ...
- oracle将查询到的数据插入到数据库的表中
一.Oracle数据库中,把一张表的查询结果直接生成并导入一张新表中. 例如:现有只有A表,查询A表,并且把结果导入B表中.使用如下SQL语句: create table b as selec ...
- P1547 Out of Hay 洛谷
https://www.luogu.org/problem/show?pid=1547 题目背景 奶牛爱干草 题目描述 Bessie 计划调查N (2 <= N <= 2,000)个农场的 ...
- spring history &design Philosophy
Spring简介 Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的.Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情.然而, ...
- 源码SDWebImage
源码来源:https://github.com/rs/SDWebImage 版本: 3.7 SDWebImage是一个开源的第三方库,它提供了UIImageView的一个分类,以支持从远程服务器下载并 ...
- WebLogic11g-创建域(Domain)及基本配置
最近看到经常有人提问weblogic相关问题,所以闲暇之际写几篇博文(基于weblogic11),仅供大家参考. 具体weblogic的介绍以及安装,这里就不赘述了. 以域的创建开篇,虽然简单,但 ...