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在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论 ...
随机推荐
- python代码docstring生成文档之sphinx
在使用python中,我们一般在模块,类,函数下使用docstring添加字符串说明性文档,使开发人员更好的可以看懂此代码是做什么用的.然而写了那么多的注释,我们想要一篇文档怎么办,第一种办法不可能将 ...
- Java企业微信开发_Exception_01_"errcode":60011,"errmsg":"no privilege to access/modify contact/party/agent "
微信企业号增加成员时,返回错误信息: jsonObject:{"errcode":60011,"errmsg":"no privilege to ac ...
- Git之Eclipse提交项目到Github并实现多人协作
一.Eclipece提交项目到Github 见 eclipse提交项目到github 二.利用github组织实现多人协作 1.新建组织: New organization
- codeforces 655D D. Robot Rapping Results Report(拓扑排序+拓扑序记录)
题目链接: D. Robot Rapping Results Report time limit per test 2 seconds memory limit per test 256 megaby ...
- codeforces 651B B. Beautiful Paintings
B. Beautiful Paintings time limit per test 1 second memory limit per test 256 megabytes input standa ...
- 关于android 图片加载优化
android应用对图片处理算是比较频繁的了,尤其是在程序加载大量图片和高分辨率图片时,最容易产生oom异常,下面是个人平时一些省内存加载方法 方法一: public Bitmap decodeFil ...
- Convolutional Neural Networks for Visual Recognition 2
Linear Classification 在上一讲里,我们介绍了图像分类问题以及一个简单的分类模型K-NN模型,我们已经知道K-NN的模型有几个严重的缺陷,第一就是要保存训练集里的所有样本,这个比较 ...
- python中http的一些编码转换
http的数据需要2种编码解码. 1. url中的特殊字符转换, 比如",', :,//等 python3中通过urllib.parse.quote(..)和urllib.parse.unq ...
- from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import Select Select(d.find_element_by_id(u'key_开户行')).first_sele ...
- oracle--pl/sql变量定义----
一.变量介绍 在编写pl/sql程序时,可以定义变量和常量:在pl/sql程序中包括有: 1).标量类型(scalar) 2).复合类型(composite) --用于操作单条记录 3).参照类型(r ...