叉叉

题目描述

现在有一个字符串,每个字母出现的次数均为偶数。接下来我们把第一次出现的字母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模拟赛的更多相关文章

  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. Mybatis异常_01_Invalid bound statement (not found)

    异常信息:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.taotao.map ...

  2. cocos2d-x 中 xml 文件读取

    实现类 CXmlParse 啥也不说了  直接上硬货  believe yourself   一看就明白 CXmlParse.h #ifndef __C_XML_PARSE__ #define __C ...

  3. Android Studio & Butter Knife —— 快速开发

    Butter Knife是一个Android的注解框架,可以帮助用户快速完成视图.资源与对象的绑定,完成事件的监听.(也就是少写findViewById()) 具体的介绍可以参考官方主页: http: ...

  4. 如何实现1080P延迟低于500ms的实时超清直播传输技术

    再来当一次技术搬运工,内容来自高可用框架,学霸君工程师袁荣喜的如何实现1080P延迟低于500ms的实时超清直播传输技术. 导语:视频直播是很多技术团队及架构师关注的问题,在实时性方面,大部分直播是准 ...

  5. Qt Quick之TableView的使用

    本博只是简单的展示TableView的基本使用(TableView.style:TableViewStyle.headerDelegate.rowDelegate.itemDelegate.Table ...

  6. SQL Server DBA十大必备工具使生活轻松

    [IT168 技术]曾经和一些DBA和数据库开发人员交流时,问他们都用过一些什么样的DB方面的工具,大部分人除了SSMS和Profile之外,基本就没有使用过 其他工具了;诚然,SSMS和Profil ...

  7. tomcat可以访问默认页面,但是无法访问webapp下的指定项目

     tomcat可以访问默认页面,但是无法访问webapp下的指定项目 1.注意下安装tomcat时的默认端口,8005,8009,8080,我这边没有修改,根据需要自行修改,确保tomcat可以启动 ...

  8. bzoj 3545: [ONTAK2010]Peaks Kruskal重构树

    题目: 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经 ...

  9. RenderingPath 渲染路径

    http://blog.csdn.net/lichaoguan/article/details/42554821 RenderingPath 渲染路径 Deferred Lighting 延时光照 延 ...

  10. Access中复制表

    很多时候在Access中需要复制表,或只复制结构,源表名:a: 新表名:b (经测试中Access可用)   法一:select * into b from a where 1<>1   ...