第一题

题意: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. java—连连看-实现消除

    实现消除 1.Chess.java package Linkup; /** * 棋子封装类 * * @author laixl * */ public class Chess { // 图片的 状态 ...

  2. 浅谈 Vue v-model指令的实现原理 - 如何利用v-model设计自定义的表单组件

    原文请点击此链接  链接1 http://www.7zhang.com/index/cms/read/id/234515.html  链接2 http://blog.csdn.net/yangbing ...

  3. 实现一个可以实时提示的textarea组件

    该组件输入.换行.变换光标可以实时给出提示 效果: textarea.vue <template> <div> <el-input id="user-input ...

  4. VS升级后的配置问题

    当vs升级到更新的版本后,运行原来无误的程序会出现一系列问题. 例如:打不开iostream文件,lib文件,系统找不到文件等等 出现这类问题的原因是,编译环境的include path和librar ...

  5. Java问题排查工具单

    前言 平时的工作中经常碰到很多疑难问题的处理,在解决问题的同时,有一些工具起到了相当大的作用,在此书写下来,一是作为笔记,可以让自己后续忘记了可快速翻阅,二是分享,希望看到此文的同学们可以拿出自己日常 ...

  6. Bootstrap 按钮,图片,辅助类

    Bootstrap 按钮 任何带有 class .btn 的元素都会继承圆角灰色按钮的默认外观.但是 Bootstrap 提供了一些选项来定义按钮的样式,具体如下表所示: 以下样式可用于<a&g ...

  7. Django 2.0 学习(06):Django 视图(进阶)

    概述 Django中的特方法,该方法代表了Django的Web页面,并且视图具有特定的模板.以博客应用为例进行说明,在博客应用中应该包含下面的视图: 博客主页:显示最近的一些记录: 详细页面:单个详细 ...

  8. python 中的queue 与多进程--待继续

    一.先说说Queue(队列对象) Queue是python中的标准库,可以直接import 引用,之前学习的时候有听过著名的“先吃先拉”与“后吃先吐”,其实就是这里说的队列,队列的构造的时候可以定义它 ...

  9. FTP-Server

    1.目录: 2. ftp_client.py import socket,os,json client=socket.socket() client.connect(('localhost',9999 ...

  10. HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)

    HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化) 题意分析 给出一系列的石头的数量,然后问石头能否被平分成为价值相等的2份.首先可以确定的是如果石头的价值总和为奇数的话,那 ...