题面:https://www.cnblogs.com/Juve/articles/11615883.html

X 国的军队:

好像有O(T*N)的直接贪心做法

其实多带一个log的二分也可以过

先对所有据点按b-a由大到小排序(按此方案排序后顺序扫是最优的)

然后二分答案

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define re register
using namespace std;
const int MAXN=1e5+5;
inline int read(){
re int x=0;re char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0',ch=getchar();}
return x;
}
int t,n,l,r;
struct node{
int a,b;
inline friend bool operator < (node p,node q){
return p.b-p.a>q.b-q.a;
}
}c[MAXN];
inline bool check(re int x){
for(re int i=1;i<=n;++i){
if(x<c[i].b) return 0;
x-=c[i].a;
}
return 1;
}
signed main(){
t=read();
while(t--){
n=read();
l=0,r=0;
for(re int i=1;i<=n;++i){
c[i].a=read(),c[i].b=read();
l+=c[i].a,r+=c[i].b;
}
sort(c+1,c+n+1);
while(l<r){
re int mid=(l+r)>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
printf("%lld\n",l);
}
return 0;
}

排列组合:

把$C_{n}^{i}*C_{n}^{i}$变成$C_{n}^{i}*C_{n}^{n-i}$,

这样的话,就是对于每个 i,计算 n 个中选 i 个的方案数乘上 n 个中选(n-i)个的方案数,最后累加起来。

这样得到的答案,实际上相当于 2n 个物品,在前 n 个中选 i 个,在后 n 个中选(n-i)个,、

又由于 i 取遍 0~n 所有整数,那么累加后方案数就等于 $C_{2*n}^{n}$。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define re register
using namespace std;
const int MAXN=2e6+5;
const int mod=1e9+7;
int t,n,fac[MAXN],inv[MAXN];
inline int q_pow(re int a,re int b,re int p){
re int res=1;
while(b){
if(b&1) res=res*a%p;
a=a*a%p;
b>>=1;
}
return res;
}
inline void get_c(re int N){
fac[0]=fac[1]=inv[0]=1;
for(re int i=2;i<=N;++i){
fac[i]=fac[i-1]*i%mod;
}
inv[N]=q_pow(fac[N],mod-2,mod);
for(re int i=N-1;i>=1;--i){
inv[i]=inv[i+1]*(i+1)%mod;
}
}
inline int C(re int n,re int m){
if(m>n) return 0;
if(m==n) return 1;
return fac[n]%mod*inv[m]%mod*inv[n-m]%mod;
}
signed main(){
get_c(2e6);
scanf("%lld",&t);
while(t--){
scanf("%lld",&n);
printf("%lld\n",C(2*n,n));
}
return 0;
}

回文:

定义g[i][j]表示i到j这一段是否回文,可以由g[i+1][j-1]转移:

for(int i=1;i<=len;++i){
g[i][i]=1;
f[i][i]=1;
for(int j=1;j<=min(i-1,len-i);++j){
if(s[i-j]==s[i+j]){
g[i-j][i+j]=1;
}else break;
}
}
for(int i=1;i<=len-1;++i){
if(s[i]==s[i+1]){
g[i][i+1]=1;
f[i][i+1]=3;
for(int j=1;j<=min(i-1,len-i-1);++j){
if(s[i-j]==s[i+1+j]){
g[i-j][i+1+j]=1;
}else break;
}
}
}

定义f[i][j]表示i到j这段的答案

有转移:$f[l][r]=f[l+1][r]+f[l][r-1]-f[l+1][r-1]+g[l][r]$

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define re register
using namespace std;
const int MAXN=5005;
char s[MAXN];
int t,len,f[MAXN][MAXN];
bool g[MAXN][MAXN];
signed main(){
scanf("%s",s+1);
len=strlen(s+1);
for(int i=1;i<=len;++i){
g[i][i]=1;
f[i][i]=1;
for(int j=1;j<=min(i-1,len-i);++j){
if(s[i-j]==s[i+j]){
g[i-j][i+j]=1;
}else break;
}
}
for(int i=1;i<=len-1;++i){
if(s[i]==s[i+1]){
g[i][i+1]=1;
f[i][i+1]=3;
for(int j=1;j<=min(i-1,len-i-1);++j){
if(s[i-j]==s[i+1+j]){
g[i-j][i+1+j]=1;
}else break;
}
}
}
for(int i=2;i<=len;++i){
for(int l=1;l<=len-i+1;++l){
int r=l+i-1;
f[l][r]=f[l+1][r]+f[l][r-1]-f[l+1][r-1]+g[l][r];
}
}
scanf("%lld",&t);
while(t--){
re int l,r;
scanf("%lld%lld",&l,&r);
printf("%lld\n",f[l][r]);
}
return 0;
}

csp-s模拟测试10.1(b)X 国的军队,排列组合, 回文题解的更多相关文章

  1. 10.1 csp-s模拟测试(b) X国的军队+排列组合+回文

    T1 X国的军队 贪心,按$b-a$的大小降序排序,然后就贪心吧 #include<iostream> #include<cstdio> #include<algorit ...

  2. [考试反思]0729NOIP模拟测试10

    安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...

  3. NOIP模拟测试10「大佬·辣鸡·模板」

    大佬 显然假期望 我奇思妙想出了一个式子$f[i]=f[i-1]+\sum\limits_{j=1}^{j<=m} C_{k \times j}^{k}\times w[j]$ 然后一想不对得容 ...

  4. 2019.7.29 NOIP模拟测试10 反思总结【T2补全】

    这次意外考得不错…但是并没有太多厉害的地方,因为我只是打满了暴力[还没去推T3] 第一题折腾了一个小时,看了看时间先去写第二题了.第二题尝试了半天还是只写了三十分的暴力,然后看到第三题是期望,本能排斥 ...

  5. noip模拟测试10

    T1 这道题在考场上想到了二维前缀和,就是自己算前缀和的方式有点麻烦,导致花的时间较长,但还是成功搞了出来. 因为暴力计算的话需要不停枚举左上角和右下角的 i ,j, 时间复杂度为 n^4 ,我当时就 ...

  6. 7.29 NOIP模拟测试10 辣鸡(ljh)+模板(ac)+大佬(kat)

    T1 辣鸡(ljh) 就是一道分类讨论的暴搜,外加一丢丢的减枝,然而我挂了,为啥呢,分类讨论变量名打错,大于小于号打反,能对才怪,写了sort为了调试就注释了,后来忘了解开,小减枝也没打.但是这道题做 ...

  7. [NOIP模拟测试10]辣鸡(ljh) 题解

    首先计算块内贡献,很显然是$(x_2-x_1)*(y_2-y_1)*2$. 然后考虑矩形之间的贡献,sort一遍分类讨论$n^2$暴力即可. 注意考虑边界情况是否能多两个,以及角对角的情况. 另外,排 ...

  8. 联赛模拟测试10 C. 射手座之日

    题目描述 分析 方法一(线段树) 线段树维护的是以当前节点为左端点的区间的贡献 而区间的右端点则会从 \(1\) 到 \(n\) 逐渐右移 当我们把右端点从 \(i-1\) 的位置扩展到 \(i\) ...

  9. Android单元测试与模拟测试详解

    测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...

随机推荐

  1. linux格式化磁盘

    linux格式化磁盘 查看系统磁盘情况 [root@db02 ~]# fdisk -l #查看当前系统上所有存储设备(包括挂在和没挂载的)  注:如果没有管理员权限是看不见磁盘的,因为fdisk默认读 ...

  2. Leetcode207. Course Schedule课程表

    现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它 ...

  3. 时间 '2018-08-06T10:00:00.000Z' 格式转化为本地时间(转)

    原文:https://blog.csdn.net/sxf_123456/article/details/81582964 from datetime import datetime,timedelta ...

  4. react添加多个域名proxy代理,跨域

    在package.json中加入如下: { "name": "demo", "version": "0.1.0", &q ...

  5. ERROR 1872

    解决 > start slave; ERROR (HY000): Slave failed to initialize relay log info structure from the rep ...

  6. All you need to know about: solder mask and paste mask

    1, 从字面理解 (1) 从字面理解,solder mask意指要mask住需要solder的地方.那么被mask的是谁呢?是绿油层.可以把默认形态的绿油层想象成与PCB板形状.面积相同,solder ...

  7. 【JZOJ6345】ZYB建围墙

    description analysis 打表找规律,自认为样例给的提示很明显 容易想到最优方案是让家庭尽量先围成一个正六边形,剩下的在最外层绕一个圈 手推一波可以知道,如果正六边形有\(n\)层,剩 ...

  8. 使用ajax怎么请求跨域资源

    1.ajax中添加“xhrFields”和“crossDomain”,如: $.ajax({ url: url, data: data, type: "post", xhrFiel ...

  9. Helvetic Coding Contest 2018 online mirror (teams allowed, unrated)F3 - Lightsabers (hard)

    题意:n个数字1-m,问取k个组成的set方案数 题解:假设某个数出现k次,那么生成函数为\(1+x+...+x^k\),那么假设第i个数出现ai次,结果就是\(\sum_{i=1}^m(1+x+.. ...

  10. excel导入、下载功能

    1.excel导入.下载功能 2.首先,我们是居于maven项目进行开发引入poi,如果不是那就手动下载相应的jar包引入项目就可以了 <!-- poi --> <dependenc ...