woc居然忘了早上有八连测T T 还好明早还有一场...今天的题除了T3都挺NOIP的...

  T1只需要按横坐标第一关键字,纵坐标第二关键字排序一个一个取就好了...

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=,inf=1e9;
struct poi{int x, y;}a[maxn];
int T, n, m, k, ans;
bool v1[maxn], v2[maxn];
void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
inline bool cmp(poi a, poi b){return a.x==b.x?a.y<b.y:a.x<b.x;}
int main()
{
read(T);
while(T--)
{
read(n); read(m); read(k); ans=;
for(int i=;i<=k;i++) read(a[i].x), read(a[i].y), v1[a[i].x]=v2[a[i].y]=;
sort(a+, a++k, cmp);
for(int i=;i<=k;i++)
if((!v1[a[i].x])&&(!v2[a[i].y])) ans++, v1[a[i].x]=v2[a[i].y]=;
printf("%d\n", ans);
}
return ;
}

  T2是道好题,但是是经典题...怎么大原题出在八连测啊

  求回文子序列个数是个经典的区间DP,今天发现区间DP写记忆化会非常好写...(但是怎么感觉NOIP的时候可能会被卡常QAQ

  设f[l][r]为区间[l,r]的回文子序列个数,考虑暴力的做法再来优化. 因为数字的值域为[1,k<=30],所以可以枚举所有的数字来统计方案数.

  先预处理出pre[i][j],nxt[i][j]分别表示第i位前面最晚出现的j和第i为后面最早出现的j的位置,枚举数字来转移的时候,考虑一下,我们显然可以把这两个字符接在[nxt[l][x]+1,pre[r][x]-1]的所有回文子序列的两端,所以方案数加上f[nxt[l][x]+1,pre[r][x]-1],这个时候已经不存在x只出现一次和只出现两次的子序列了,所以如果nxt[l][x]<pre[r][x],我们可以加上x只出现两次的方案,如果nxt[l][x]<=pre[r][x],我们可以加上x只出现一次的方案,于是总的DP方程为(博客园的公式加载可能需要一点时间QAQ):

$f[l][r]=\sum_{x=1}^{k}f[nxt[l][x]+1][pre[r][x]-1]+[nxt[l][x]<pre[r][x]]+[nxt[l][x]\leq pre[r][x]]$

暴力代码:

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define ll long long
#define MOD(x) ((x)>=mod?(x)-mod:(x))
using namespace std;
const int maxn=,mod=1e9+;
int T, n, m, k, l, r;
int a[maxn], f[maxn][maxn], pre[maxn][maxn], nxt[maxn][maxn], last[maxn];
void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
int dfs(int l, int r)
{
if(f[l][r]!=-)return f[l][r];
if(l>r)return ;
int ans=;
for(int i=;i<=k;i++)
if(nxt[l][i] && pre[r][i])
ans+=dfs(nxt[l][i]+, pre[r][i]-)+(nxt[l][i]<=pre[r][i])+(nxt[l][i]<pre[r][i]), ans=MOD(MOD(ans));
return f[l][r]=ans;
}
int main()
{
read(T);
while(T--)
{
read(n); read(m); read(k);
memset(f, -, sizeof(f));
memset(last, , (k+)<<);
for(int i=;i<=n;i++) read(a[i]);
for(int i=;i<=n;i++)
{
last[a[i]]=i;
for(int j=;j<=k;j++) pre[i][j]=last[j];
}
for(int i=;i<=k;i++) last[i]=n+;
for(int i=n;i;i--)
{
last[a[i]]=i;
for(int j=;j<=k;j++) nxt[i][j]=last[j];
}
for(int i=;i<=m;i++) read(l), read(r), printf("%d\n", dfs(l, r));
}
return ;
}

  其实可以发现每移动一维,至多改变两种数字的贡献,所以我们可以从f[l+1][r]转移的时候去掉[l+1,r]中a[l]和a[l+1]的贡献,在[l,r]里重新加上a[l]和a[l+1]的贡献,注意如果a[l]==a[l+1]的话不能去掉两次加两次...

  DP方程不好写就不写了...

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define ll long long
#define MOD(x) ((x)>=mod?(x)-mod:(x))
using namespace std;
const int maxn=,mod=1e9+;
int T, n, m, k, l, r;
int a[maxn], f[maxn][maxn], pre[maxn][maxn], nxt[maxn][maxn], last[maxn];
void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
int dfs(int l, int r);
inline int calc(int l, int r, int x)
{
if(l>r || nxt[l][x]==n+ || !pre[r][x] || !x) return ;
int ans=dfs(nxt[l][x]+, pre[r][x]-)+(nxt[l][x]<=pre[r][x])+(nxt[l][x]<pre[r][x]);
return MOD(ans);
}
int dfs(int l, int r)
{
if(f[l][r]!=-)return f[l][r];
if(l>r)return ;
f[l][r]=dfs(l+, r);
if(l<r && a[l]!=a[l+]) f[l][r]=f[l][r]+calc(l, r, a[l+]); f[l][r]=MOD(f[l][r]);
if(a[l]!=a[l+]) f[l][r]=f[l][r]-calc(l+, r, a[l])+mod; f[l][r]=MOD(f[l][r]);
f[l][r]=f[l][r]-calc(l+, r, a[l+])+mod; f[l][r]=MOD(f[l][r]);
f[l][r]=f[l][r]+calc(l, r, a[l]); return f[l][r]=MOD(f[l][r]);
}
int main()
{
read(T);
while(T--)
{
read(n); read(m); read(k);
for(int i=;i<=n;i++) for(int j=i;j<=n;j++) f[i][j]=-;
memset(last, , (k+)<<);
for(int i=;i<=n;i++) read(a[i]);
for(int i=;i<=n;i++)
{
last[a[i]]=i;
for(int j=;j<=k;j++) pre[i][j]=last[j];
}
for(int i=;i<=k;i++) last[i]=n+;
for(int i=n;i;i--)
{
last[a[i]]=i;
for(int j=;j<=k;j++) nxt[i][j]=last[j];
}
for(int i=;i<=m;i++) read(l), read(r), printf("%d\n", dfs(l, r));
}
return ;
}

  T3是道思维题...

  有两种做法,一种是正解:即求出$\sum_{i=1}^{n}i^2*(a_i-a_j)$和$\sum_{i=1}^{n}i*(a_i-a_j)$,两式相除即可...这个可以在模意义下做就不用担心爆long long

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define ll long long
#define MOD(x) ((x)>=mod?(x)-mod:(x))
using namespace std;
const int maxn=,mod=1e9+;
unsigned int T, n, x, sum1, sum2;
void read(unsigned int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
inline int power(int a, int b)
{
int ans=;
for(;b;b>>=, a=1ll*a*a%mod)
if(b&) ans=1ll*ans*a%mod;
return ans;
}
int main()
{
read(T);
while(T--)
{
read(n); sum1=sum2=;
for(int i=;i<=n;i++) read(x), sum1=(1ll*sum1+1ll*i*x)%mod, sum2=(1ll*sum2+1ll*i*i%mod*x)%mod;
for(int i=;i<=n;i++) read(x), sum1=1ll*sum1-1ll*i*x%mod+mod, sum2=(1ll*sum2-1ll*i*i%mod*x%mod+mod), sum1=MOD(sum1), sum2=MOD(sum2);
if(!sum1) puts("");
else printf("1 %lld\n", 1ll*sum2*power(sum1, mod-)%mod);
}
return ;
}

  第二种做法是异或.开一个数组,对于每个数,二进制下哪位是1就给数组的哪位的异或上当前位置,如果最后数组有哪一位不是0就输出就好了...

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=,inf=1e9;
unsigned int n, x, now, sum, T;
int f[];
void read(unsigned int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
int main()
{
read(T);
while(T--)
{
read(n); sum=;
memset(f, , sizeof(f));
for(int i=;i<=n;i++)
{
read(x); sum^=x; now=;
while(x)
{
now++;
if(x&) f[now]^=i;
x>>=;
}
}
for(int i=;i<=n;i++)
{
read(x); sum^=x; now=;
while(x)
{
now++;
if(x&) f[now]^=i;
x>>=;
}
}
if(!sum) puts("");
else
{
for(int i=;i<=;i++)
if(f[i])
{
printf("1 %d\n", f[i]);
break;
}
}
}
return ;
}

洛谷八连测R5题解的更多相关文章

  1. 洛谷八连测R6

    本次测试暴0!!!还有两周就要考试啦!!! 看题目时觉得难度不大,就直接写正解,没有参照数据,导致测出的结果和预想有较大差距. 不过得到经验,不管题目难易(除了D1T1)都要参照数据一部分一部分写,那 ...

  2. 洛谷10月月赛R2·浴谷八连测R3题解

    早上打一半就回家了... T1傻逼题不说了...而且我的写法比题解要傻逼很多T T T2可以发现,我们强制最大值所在的块是以左上为边界的倒三角,然后旋转4次就可以遍历所有的情况.所以二分极差,把最大值 ...

  3. 洛谷八连测R4

    1.逃避 https://www.luogu.org/problemnew/show/T14561 注意: 1.输入时需要用EOF判断,否则会TLE. 2.用flag判断字符是不是每一句首字母. 3. ...

  4. 浴谷八连测R6题解(收获颇丰.jpg)

    这场的题都让我收获颇丰啊QWQ 感谢van♂老师 T1 喵喵喵!当时以为经典题只能那么做, 思维定势了... 因为DP本质是通过一些条件和答案互相递推的一个过程, 实际上就是把条件和答案分配在DP的状 ...

  5. 浴谷八连测R4题解

    一开始出了点bug能看见排行榜,于是我看见我半个小时就A掉了前两题,信心场QAQ T1字符串题就不说了qwq #include<iostream> #include<cstring& ...

  6. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

  7. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  8. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

  9. 洛谷P1577 切绳子题解

    洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...

随机推荐

  1. 「Leetcode」976. Largest Perimeter Triangle(C++)

    分析 好久不刷题真的思维僵化,要考虑到这样一个结论:如果递增的三个数\(x_i,x_{i+1},x_{i+2}\)不符合题意,那么最大的两边之差一定大于等于第一条边,那么任何比第一条边小的都不能成立. ...

  2. 车架号识别,VIN码识别 助力汽车后市场

    又有一家汽配圈新贵引入了小译家的 车架号识别(VIN码识别)技术 那就是明觉科技 是一个服务于汽车后市场 集数据服务.行业数据挖掘 及“互联网+”为一体的汽配信息协作平台 旗下拥有一款全车零配件信息智 ...

  3. 创建第一个Scrapy项目

    d:进入D盘 scrapy startproject tutorial建立一个新的Scrapy项目 工程的目录结构: tutorial/ scrapy.cfg # 部署配置文件 tutorial/ # ...

  4. 直线石子合并(区间DP)

    石子合并 时间限制:1000 ms  |  内存限制:65535 KB 描述有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费 ...

  5. DX孟虎点评新兴市场:巴西俄罗斯火爆背后

    [亿邦动力网讯]4月3日消息,在第九届中国中小企业电子商务大会暨2014中国(河南)跨境贸易电子商务峰会上,DX公司CEO孟虎对新兴市场做了详细的分析,指出在当今的跨境电商环境下,北美.西欧作为电商成 ...

  6. Linux 深入理解inode/block/superblock

    基础命令学习目录首页 原文链接:https://blog.csdn.net/Ohmyberry/article/details/80427492 档案系统特性 传统的磁盘与档案系统之应用中,一个分割槽 ...

  7. 选题博客:北航iCourse课程信息平台

    1. 用户调查 在选题的时候,我们面向北航所有本科在读本科生,发布了<北航信息平台用户调查>.此次问卷调查共回收有效问卷95份. 1.1 功能需求调查 调查其中一项是让同学们对平台功能进行 ...

  8. python正则表达式re之compile函数解析

    re正则表达式模块还包括一些有用的操作正则表达式的函数.下面主要介绍compile函数. 定义: compile(pattern[,flags] ) 根据包含正则表达式的字符串创建模式对象. 通过py ...

  9. [Linux] Migrate plugins and setting for vim

    Hot to migrate plugins and setting for vim from one computer to another ? Just copy  ~/.vim and ~/.v ...

  10. DP--HDU 1003(最大子串和)

    问题描述:          给定整数A1, A2,--AN (可能有负数),求I到j的最大值. 例如:          -2, 11, -4, 13, -5, -2时答案为20 对于这个问题的算法 ...