2017-10-15 NOIP模拟赛
Stack
#include<iostream>
#include<cstdio>
#define mod 7
using namespace std;
int f[][],n;
int main(){
freopen("stack.in","r",stdin);freopen("stack.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)
for(int j=;j<=i;j++){
if(j)f[i][j]=f[i-][j]+f[i][j-];
else f[i][j]=;
while(f[i][j]>=mod)f[i][j]-=mod;
}
printf("%d",f[n][n]);
return ;
}
100分 卡特兰数求第n项取模
Cube
/*
记录每个点下面有多少元素top[i],他所在并查集的大小,每次移动操作就把移动后在上面的那部分中所有的点的top加上它移动到的病茶几的大小,修改复杂度很高,查询是O(1)的
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 30010
using namespace std;
int p,fa[maxn],sz[maxn],top[maxn];
char ch[];
int find(int x){
if(fa[x]==x)return fa[x];
return fa[x]=find(fa[x]);
}
int main(){
//freopen("Cola.txt","r",stdin);
freopen("cube.in","r",stdin);freopen("cube.out","w",stdout);
scanf("%d",&p);
int n=;
for(int i=;i<=;i++)fa[i]=i,sz[i]=;
while(p--){
scanf("%s",ch);
int x,y;
if(ch[]=='M'){
scanf("%d%d",&x,&y);
n=max(n,max(x,y));
int f1=find(x),f2=find(y);
if(f1!=f2){
for(int i=;i<=n;i++){
if(find(i)==f1){
top[i]+=sz[f2];
}
}
fa[f1]=f2;
sz[f2]+=sz[f1];
sz[f1]=;
} }
else{
scanf("%d",&x);
n=max(n,x);
printf("%d\n",top[x]);
}
}
}
70分 暴力并查集
#include<iostream>
#include<cstdio>
#define maxn 30010
using namespace std;
int p,cnt[maxn],sum[maxn],fa[maxn];
char s[];
int find(int x){
if(x==fa[x])return fa[x];
int f=fa[x];
fa[x]=find(fa[x]);
cnt[x]+=cnt[f];
return fa[x];
}
void merge(int x,int y){
fa[y]=x;
cnt[y]+=sum[x];
sum[x]+=sum[y];
sum[y]=;
}
int main(){
freopen("cube.in","r",stdin);freopen("cube.out","w",stdout);
for(int i=;i<=;i++)fa[i]=i,sum[i]=;
scanf("%d",&p);
while(p--){
scanf("%s",s);
int x,y;
if(s[]=='M'){
scanf("%d%d",&x,&y);
merge(find(x),find(y));
}
else {
scanf("%d",&x);
printf("%d\n",sum[find(x)]-cnt[x]-);
}
}
}
100分 带权并查集
Zuma
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<queue>
using namespace std;
map<string,bool>vis;
string s,snow;
struct node{
string s;
int step;
}cur,nxt;
queue<node>q;
void down(){
string pre=snow;
snow="";
for(int i=;i<pre.length();){
while(pre[i]==''&&i<pre.length())i++;
snow=snow+pre[i];i++;
}
}
void updata(){
string pre=snow;
bool flag=;
for(int i=;i<pre.length();i++){
if(pre[i]==pre[i-]&&pre[i]==pre[i+])flag=,snow[i]=snow[i-]=snow[i+]='';
}
if(flag){
down();
updata();
}
}
int main(){
//freopen("Cola.txt","r",stdin);
freopen("zuma.in","r",stdin);freopen("zuma.out","w",stdout);
cin>>s;
vis[s]=;
cur.s=s;cur.step=;
//cout<<s<<endl;
bool flag=;
int n1=,n0=;
for(int i=;i<s.length();i++){
if(s[i]==s[i-]){
flag=;break;
}
if(s[i]=='')n0++;
if(s[i]=='')n1++;
}
if(flag==){
int ans=;
if(s[]=='')n0++;
if(s[]=='')n1++;
if(n1%==&&n0%==&&n1==n0){
ans=+(n1/)+((n0-)/)+;
printf("%d",ans);
return ;
}
if(n1%==&&n0%==&&n1==n0){
ans=+((n1-)/)+((n0-)/);
printf("%d",ans);
return ;
}
if(n1<n0)swap(n1,n0);
if(n1%==&&n0==n1-){
ans=+((n1-)/)+(n0/);
printf("%d",ans);
return ;
}
if(n1%==&&n0==n1-){
ans=+(n1/)+((n0-)/);
printf("%d",ans);
return ;
}
}
q.push(cur);
while(!q.empty()){
cur=q.front();q.pop();
int len=cur.s.length();
//cout<<cur.s<<endl;
if(len==){printf("%d",cur.step);return ;}
for(int i=;i<=len;i++){//在第i个前面插
snow="";
snow=snow+cur.s.substr(,max(,i));
snow=snow+"";
snow=snow+cur.s.substr(i,len-i);
string now=snow;
updata();
if(!vis[snow]){
vis[snow]=;
nxt.s=snow;nxt.step=cur.step+;
q.push(nxt);
if(nxt.s.length()==&&nxt.s[]!=''&&nxt.s[]!=''){printf("%d",nxt.step);return ;}
}
//cout<<snow<<endl; snow=now;
snow[i]='';
updata();
if(!vis[snow]){
vis[snow]=;
nxt.s=snow;nxt.step=cur.step+;
q.push(nxt);
if(nxt.s.length()==&&nxt.s[]!=''&&nxt.s[]!=''){printf("%d",nxt.step);return ;}
}
//cout<<snow<<endl;
}
}
fclose(stdin);fclose(stdout);
return ;
}
65分 宽搜
/*
区间dp,情况有些多需要讨论
首先连续相同的颜色为了方便要合并,记录每个块的颜色,就可以dp了
dp[l][r]表示合并这段区间的最小步数,分几种情况
这段区间是奇数(为了避免区间长度为2的情况)
1. color[l]==color[r] && tot[l]+tot[r]==2 --> dp[l][r] 可从 dp[l+1][r-1]+1 转移过来。
2. color[l]==color[r] && tot[l]+tot[r]>2 --> dp[l][r] 可从 dp[l+1][r-1] 转移过来。
3. color[l]==color[k]==color[r](k∈(l,r) && [l,k],[k,r] 为奇数) -->可从dp[l+1][k-1]+dp[k+1][r-1]转移过来。
这段区间是偶数
普通的转移 dp[l][r] =min(dp[l][r] , dp[l][k]+dp[k+1][r]);
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 257
using namespace std;
int dp[maxn][maxn],col[maxn],a[maxn];
char s[maxn];
int n,m,ans;
int main(){
freopen("zuma.in","r",stdin);freopen("zuma.out","w",stdout);
scanf("%s",s);n=strlen(s);
a[]=;m=;
for(int i=;i<n;i++){
if(s[i]==s[i-]){
col[m]=s[i]-'';
a[m]++;
}
else {
a[++m]=;
col[m]=s[i]-'';
}
}
for(int len=;len<=m;len++){
for(int i=;i<=m;i++){
int j=i+len;
if(j>=&&j<=m){
dp[i][j]=*n;
if(len==)dp[i][j]=-a[i];
else {
for(int k=i;k<j;k++)
dp[i][j]=min(dp[i][k]+dp[k+][j],dp[i][j]);
if((j-i)%==){
if(a[i]+a[j]==){
if(col[i]==col[j])
dp[i][j]=min(dp[i][j],dp[i+][j-]+);
}
else
if(col[i]==col[j])
dp[i][j]=min(dp[i][j],dp[i+][j-]);
if(a[i]+a[j]<)
for(int k=i+;k<j;k+=)
if(a[k]==)dp[i][j]=min(dp[i+][k-]+dp[k+][j-],dp[i][j]);
}
}
}
}
}
printf("%d\n",dp[][m]);
return ;
}
100分 区间dp
2017-10-15 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考验卡常数还只有一档暴力分. ...
- 2018.10.03 NOIP+ 模拟赛 解题报告
得分: \(30+5+0=35\)(考得真不咋滴) \(T1\):奥义商店(点此看题面) 以为很简单,对着这题想了一个多小时,最后果断打了个暴力交了... ... 看完题解发现其实也不是很难. 对于\ ...
- 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.5.27 NOIP模拟赛(hzwer2014-5-16 NOIP模拟赛)
期望得分:100+100+60+30=290 实际得分:100+20+60+0=180 当务之急:提高一次正确率 Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一 ...
- 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.30 NOIp模拟赛 T1 改造二叉树
[题目描述] 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论 ...
随机推荐
- ES索引瘦身 压缩——_source _all 均disable filed store为no,引入第三方DB存储原始数据,去掉pos倒排和doc_values,强制定期merge segments,将所有fileds合并为一个field big string
原始数据:835MB ES 设置了_source _all disabled 且设置了仅仅存docs倒排Wed Feb 22 11:58:27 CST 2017Before size:1 /home/ ...
- [深入学习C#]C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)
简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作. 这就可以使用线程来实现. ...
- hbase_学习_01_HBase环境搭建(单机)
一.前言 本文承接上一篇:hadoop_学习_02_Hadoop环境搭建(单机) ,主要是搭建HBase的单机环境 二.环境准备 1.说明 hbase 的下载来源有: 官方版本:http://arc ...
- spring MVC basic
1.MVC&&Spring MVC .mvc的就核心思想是业务数据抽取同业务数据呈现相分离 .View,视图层,为用户提供UI,重点关注数据的呈现 .model,业务数据的信息表示,关 ...
- POJ-1741(树分治)
树的点分治 给出详细的讲解!!点这里打开论文-分治算法在树的路径问题中的应用 本题目是他讲的第一个例题: 我的理解:每次都找树的重心,计算以重心为根的子树之间所贡献的答案.不断这样下去:如果这棵树是一 ...
- BEC listen and translation exercise 42
These were built for the workers towards the end of the eighteenth century, and they are still furni ...
- 菜单栏(QMenuBar)与菜单(QMenu)
之前一直搞不清楚什么是菜单栏,后来看了文档才知道是怎么一回事,下面是我本人对菜单栏和菜单的理解,可能存在理解错误. 一.菜单栏 菜单栏是容纳菜单的一个容器,里面可以存放菜单列表,用菜单栏的目的就是为了 ...
- 【leetcode刷题笔记】String to Integer (atoi)
Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...
- Gym 101142 I.Integral Polygons(计算几何)
题意:给定一个凸包,现在让你连接凸包上两点,把凸包变为两个多边形,满足两个多边形的面积都是整数. 思路:我们知道整点的三角形面积S=叉积/2,则S要么是整数,要么是整数+0.5.那么多边形有多个三角形 ...
- Hihocoder1662 : 查找三阶幻方([Offer收割]编程练习赛40)(暴力)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个N x M的矩阵,请你数一数其中有多少个3 x 3的子矩阵可以构成三阶幻方? 如果3 x 3的矩阵中每一行.每一列 ...