第一题

题意:n个点,每个点坐标pi属性ai,从右往左将遇到的点向左ai范围内的点消除,后继续扫描。

现可以在扫描开始前提前消除从右往左任意点,问最少消除数(提前+扫描)。

n,pi,ai<=10^6

题解:很蠢的DP,我好蠢啊……

f[i]表示前i个的最少消除数(不含提前)

从左往右添加,每添加一个点x,它覆盖范围内的y个点失去作用,那么当前消除情况是f[x-y-1]+y,因为前面是不变的QAQ

简单的递推我都想半天……菜。

#include<cstdio>
#include<cstring>
#include<cctype>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
int read()
{
char c;int s=,t=;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}while(isdigit(c=getchar()));
return s*t;
}
/*------------------------------------------------------------*/
const int inf=0x3f3f3f3f,maxn=;
struct cyc{int p,num;}a[maxn];
int n,b[maxn],sum[maxn];
bool cmp(cyc a,cyc b)
{return a.p<b.p;}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)a[i].p=read(),a[i].num=read(),a[i].p++;
sort(a+,a+n+,cmp);
int cnt=;sum[]=;
for(int i=;i<=maxn&&cnt<=n;i++)
{
sum[i]=sum[i-];
if(a[cnt].p==i){sum[i]++;cnt++;}
}
int ans=n;b[]=;
for(int i=;i<=n;i++)
{
int now=a[i].p-a[i].num-;
if(now<)now=;
b[i]=b[sum[now]]+sum[a[i].p]-sum[now]-;
ans=min(ans,b[i]+(n-i));
}
printf("%d",ans);
return ;
}

第二题

题意:给定a和b(两个正整数)加起来的结果和异或起来的结果,求a和b有几种搭配可能,ab不同时互换算两种。

a,b<=10^12

题解:x是和,y是异或答案

异或相当于每一位上进行不进位加法。

所以(x-y)>>1得到哪些位上做了进位,这些位上两个数都是1(y=0),只有一种可能。

一些位上y=0且不进位,这些位上两个数都是0,只有一种可能。

一些位上y=1,这些位上可以一数为0一数为1,有两种可能。

所以ans=2^(y中1的数量)。

但是还有一些不合法情况:

1.(x-y)的最低位不能是1,否则答案为0。

2.每一位上(x-y)>>1若是1则y必须也是0,否则答案为0。

3.x=y时答案-2,因为和与异或相等仅当不进位,不进位才可能出现0,此时不满足。

4.x<y时无解。

最后,记得1ll<<x!!!

#include<cstdio>
#include<cstring>
#include<cctype>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
int read()
{
char c;int s=,t=;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}while(isdigit(c=getchar()));
return s*t;
}
/*------------------------------------------------------------*/
const int inf=0x3f3f3f3f; int n;
ll x,y,ans=;
int main()
{
scanf("%lld%lld",&x,&y);
ll num=x-y;
if(num&||x<y){printf("");return ;}
num>>=;
for(int i=;(1ll<<i)<=num;i++)if((num&(1ll<<i))&&(y&(1ll<<i))){printf("");return ;}
for(int i=;(1ll<<i)<=y;i++)
{
//printf("sfsdf");
if(y&(1ll<<i))ans=ans*;
//if((!y&(1<<i))&&(!num&(1<<i)))ans
}
if(x==y)ans-=;
printf("%lld",ans);
return ;
}

第三题

题意:给定数字串,每次可以删去一个回文子串,删去后两端拼接,求最少次数删去全串。串长<=500。

题解:大力DP,O(n^3),好强啊……你们怎么都会DP。

虽然一眼区间DP感觉,但仔细一想就觉得很复杂啊……其实只要搞清楚转移方式,DP就会帮你完成复杂的工作。

区间DP最大的特点是按区间长度从小到大枚举,具有最优子结构!

考虑这道题的多个消除的回文之间只有两种可能:嵌套||并列,不可能交叉,这使区间DP成为可能。

f[i][j]表示删除i~j的最少次数,h[i][j]表示i~j是否回文,有以下情况:

1.回文:h[i][j]=1,即区间回文,f[i][j]=1。

2.嵌套:a[i]=a[j],尝试从a[i+1][j-1],已知a[i+1][j-1]最后删除的一步是回文,所以两端的i和j可以直接附加上,即f[i][j]=min(f[i][j],f[i+1][j-1]),步步推进。

3.并列:枚举将区间分成两部分,f[i][j]=min(f[i][j],f[i][x]+f[x+1][j])。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=;
int n,f[maxn][maxn],a[maxn];
bool h[maxn][maxn];
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
memset(f,0x3f,sizeof(f));
for(int i=;i<=n;i++)f[i][i]=h[i][i]=h[i][i-]=;
for(int p=;p<=n;p++){
for(int i=;i+p-<=n;i++){
int j=i+p-;
h[i][j]=h[i+][j-]&(a[i]==a[j]);
if(h[i][j])f[i][j]=;else{
if(a[i]==a[j])f[i][j]=f[i+][j-];
for(int x=i;x<j;x++)
f[i][j]=min(f[i][j],f[i][x]+f[x+][j]);
}
}
}
printf("%d",f[][n]);
return ;
}

【比赛】STSRM 09的更多相关文章

  1. 周赛-Killing Monsters 分类: 比赛 2015-08-02 09:45 3人阅读 评论(0) 收藏

    Killing Monsters Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...

  2. 周赛-Expression 分类: 比赛 2015-08-02 09:35 3人阅读 评论(0) 收藏

    A. Expression time limit per test1 second memory limit per test256 megabytes inputstandard input out ...

  3. 周赛-Colored Sticks 分类: 比赛 2015-08-02 09:33 7人阅读 评论(0) 收藏

    Colored Sticks Time Limit: 5000MS Memory Limit: 128000K Total Submissions: 32423 Accepted: 8556 Desc ...

  4. 周赛-The Number Off of FFF 分类: 比赛 2015-08-02 09:27 3人阅读 评论(0) 收藏

    The Number Off of FFF Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...

  5. 周赛-kiki's game 分类: 比赛 2015-08-02 09:24 7人阅读 评论(0) 收藏

    kiki's game Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 40000/10000 K (Java/Others) Total S ...

  6. 周赛-Clique in the Divisibility Graph 分类: 比赛 2015-08-02 09:02 23人阅读 评论(3) 收藏

    Clique in the Divisibility Graph time limit per test1 second memory limit per test256 megabytes inpu ...

  7. Windows7WithSP1/TeamFoundationServer2012update4/SQLServer2012

    [Info   @09:03:33.737] ====================================================================[Info   @ ...

  8. 杭州电子科技大学Online Judge 之 “确定比赛名次(ID1285)”解题报告

    杭州电子科技大学Online Judge 之 "确定比赛名次(ID1285)"解题报告 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozh ...

  9. 1042 数字0-9的数量 1050 循环数组最大子段和 1062 序列中最大的数 1067 Bash游戏 V2 1092 回文字符串

    1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 给出一段区间a-b,统计这个区间内0-9出现的次数.   比如 10-19,1出现11次 ...

随机推荐

  1. Martin Fowler关于IOC和DI的文章(原版)

    Inversion of Control Containers and the Dependency Injection pattern In the Java community there's b ...

  2. 总结get和post区别

    参考博文: 浅谈HTTP中Get与Post的区别 1. 数据传递方向: Get是向服务器发索取数据的一种请求,Post是向服务器提交数据的一种请求 (都是请求,并不是一个取一个发) Get:①用于获取 ...

  3. scrapy(1)——scrapy介绍

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中.所谓网络爬虫,就是一个在网上到处或定向抓取数据的程序,当然,这种说 ...

  4. Windows Server 2012四大版本介绍

    今天刚好要尝试安装Windows Server 2012,在网上百度了下发现有4个版本,分别是: Datacenter数据中心版. Standard标准版. Essentials版. Foundati ...

  5. 异常--try..catch

    class Program { static void Main(string[] args) { try { object obj = null; int N = (int)obj; } catch ...

  6. ibatsi学习总结

    学习来源:黑马程序员 先总结一下遇到的问题 问题1:1,resultMap 可以不写,比如配置1 配置1: <typeAlias alias="puser" type=&qu ...

  7. 基于c++和opencv底层的图像旋转

    图像旋转:本质上是对旋转后的图片中的每个像素计算在原图的位置. 在opencv包里有自带的旋转函数,当你知道倾斜角度theta时: 用getRotationMatrix2D可得2X3的旋转变换矩阵 M ...

  8. memcached安装与启动

    windows 安装1.4.4版本 https://pan.baidu.com/s/1xX1NThLqeq2zNMaqONFgkQ 解压,“以管理员身份” 运行cmd,切换到memcached根目录, ...

  9. delphi鼠标状态

    Screen.Cursor := crNo;

  10. nginx 反向代理 ,入门

    入门:http://www.cnblogs.com/jjzd/p/6691500.html 启动,重新加载:http://blog.csdn.net/zhongguozhichuang/article ...