2019-11-12
时间:2019-11-12
本文章向大家介绍2019-11-12,主要包括2019-11-12使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
T1
一道知道了结论就很简单的题。。 显然(?) ,按照字典序输出的字符串满足条件。。然后用stl自带的sort排一下序就可以了。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=1e6+10;
string a[maxn];
int n,tong[maxn],qaq[maxn],tot,shawn[maxn];
struct node{
int x,y;
}ans[maxn];
inline bool cmpl(int x,int y){
return a[x]<a[y];
}
int main(){
freopen("block.in","r",stdin);
freopen("block.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
cin>>a[i],qaq[i]=i;
sort(qaq+1,qaq+1+n,cmpl);
for(int i=1;i<=n;i++) tong[i]=i,shawn[i]=i;
for(int i=1,cxk,qbl;i<=n;i++){
if(qaq[i]!=shawn[i]){
ans[++tot]=(node){i,tong[qaq[i]]};
cxk=shawn[i];qbl=qaq[i];
swap(shawn[i],shawn[tong[qaq[i]]]);
swap(tong[cxk],tong[qbl]);
}
}
printf("%d\n",tot);
for(int i=1;i<=tot;i++)
printf("%d %d\n",ans[i].x,ans[i].y);
return 0;
}
T2
我实在是不想写了,于是我选择粘题解。
注意这里为什么需要用主席树:因为在计算时我们必须保证\(t_i>v\) 因此可以用主席树来维护。。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;
const int maxn=2e5+10;
int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,m,x,a[maxn],ned[maxn],sufned[maxn],root[maxn],tot;
struct node{
int ls,rs;
long long sum;
}tree[maxn<<5];
void update(int node){
tree[node].sum=tree[tree[node].ls].sum+tree[tree[node].rs].sum;
}
int add(int pre,int l,int r,int ql,int qr){
int node=++tot;
tree[node]=tree[pre];
if(l==r){
tree[node].sum+=qr;
return node;
}
int mid=l+r>>1;
if(ql<=mid) tree[node].ls=add(tree[pre].ls,l,mid,ql,qr);
else tree[node].rs=add(tree[pre].rs,mid+1,r,ql,qr);
update(node);
return node;
}
int query(int node,int l,int r,int ql,int qr){
if(ql<=l && r<=qr) return tree[node].sum;
int mid=l+r>>1,sum=0;
if(ql<=mid) sum+=query(tree[node].ls,l,mid,ql,qr);
if(mid<qr) sum+=query(tree[node].rs,mid+1,r,ql,qr);
return sum;
}
int check(int mid){
int sum=0;
int pos=lower_bound(a+1,a+1+n,mid)-a;
sum=sufned[pos]-(mid/x)*(n-pos+1);
if(mid%x+1<=x-1)
sum+=query(root[pos],0,x-1,mid%x+1,x-1);
return sum;
}
int work(int qaq){
int l=0,r=a[n],mid,ans;
while(l<r){
mid=(l+r)>>1;
if(check(mid)>qaq) l=ans=mid+1;
else r=ans=mid;
}
return max(ans-qaq,(long long)0);
}
signed main(){
n=read();m=read();x=read();
for(int i=1;i<=n;i++) a[i]=read();
sort(a+1,a+1+n);
for(int i=1;i<=n;i++) ned[i]=a[i]/x;
for(int i=n;i>=1;i--){
sufned[i]=sufned[i+1]+ned[i];
root[i]=add(root[i+1],0,x-1,a[i]%x,1);
}
for(int i=1,qaq;i<=m;i++){
qaq=read();
printf("%lld\n",work(qaq));
}
}
T3
一道很好的题。我们考虑每一位对答案的贡献。显然每一位对答案的贡献受在当前位后面的最近的加号的影响。我们考虑枚举最近的加号在当前为后面的情况:若当前位为\(i\),离其最近的加号在其后面\(j\)位,显然贡献为:\(10^{j-1}*\displaystyle \binom {(n-1)-j}{k-1}\) 然后你会惊奇的发现,所有的加号在某一位的后面\(j\)位,它们的这个系数都是一样的。 另外对于\(i\)位来说,加号可能在其后面\([1,n-i]\)位,因此可以将这个系数后缀和一下。可是我们只讨论了后面有加号的情况,没有加号的情况怎么办呢?手推一下加在系数里面就好了QAQ。然后就没有然后了,注意处理阶乘和逆元。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;
const int maxn=5e5;
const int mod=998244353;
int inv[maxn+10],fac[maxn+10];
int n,k,num[maxn+10],f[maxn+10],ans;
char a[maxn+10];
int ksm(int x,int y){
int sum=1;
while(y){
if(y&1) sum=sum*x%mod;
x=x*x%mod;y>>=1;
}
return sum;
}
void prepare_work(){
fac[0]=1;for(int i=1;i<=maxn;i++) fac[i]=fac[i-1]*i%mod;
inv[maxn]=ksm(fac[maxn],mod-2);
for(int i=maxn-1;i>=0;i--) inv[i]=inv[i+1]*(i+1)%mod;
}
int C(int x,int y){
if(x<0 || x<y) return 0;
return fac[x]*inv[y]%mod*inv[x-y]%mod;
}
signed main(){
scanf("%lld %lld",&n,&k);
cin>>a+1;
for(int i=1;i<=n;i++)
num[i]=a[i]-'0';
prepare_work();
for(int i=n-1;i;i--){
f[i]=(f[i+1]+ksm(10,n-i-1)*C(i-1,k-1)%mod)%mod;
}
for(int i=1;i<=n;i++){
f[i]=(f[i]+ksm(10,n-i)*C(i-1,k)%mod)%mod;
}
for(int i=1;i<=n;i++){
ans=(ans+f[i]*num[i]%mod)%mod;
}
printf("%lld",ans);
return 0;
}
原文地址:https://www.cnblogs.com/mendessy/p/11844837.html
- 【OpenCV学习笔记之一】图像加载,修改及保存
- 【干货】一种直观的方法认识梯度下降
- 漫谈Java IO之普通IO流与BIO服务器
- 浅谈强化学习的方法及学习路线
- 【亲测有效】Win10家庭版Microsoft Edge页面出现乱码的两种解决方案及gpedit.msc命令无法使用的解决策略
- Fiddler抓包7-post请求(json)
- Selenium2+python自动化56-unittest之断言(assert)
- 长文 | 手把手教你如何使用python进行数据分析(最好将文章代码自己码一遍)
- 回归与梯度下降法及实现原理
- 【宅男宅女们的福音】电影天堂最新电影爬取及搜索脚本
- 把模块有关联的放在一个文件夹中 在python2中调用文件夹名会直接失败 在python3中调用会成功,但是调用不能成功的解决方案
- numpy用法小结
- 凯撒密码加解密及破解实现原理
- linux bash Shell脚本经典 Fork炸弹演示及命令详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- a伪类
- CodeForces - 1102A(思维题)
- C++使用指针,动态数组,指针做参数需要注意的问题等总结
- POJ 1170 Shopping Offers非状态压缩做法
- HDU 4283 You Are the One
- C++cin,cout以及常见函数总结,cin,cout格式化控制
- 最简单,最明了,看了就会的VScode和C++的配置!(Visual Studio Code)
- C++字符串输入输出以及复合类型浅谈
- Codeforce 1155D Beautiful Array(DP)
- C++类型转换几种情况
- 疯子的算法总结(九) 图论中的矩阵应用 Part 1 POJ3613 Cow Relays
- 『数据库』你这些知识点都不会,你学个锤子SQL数据库!
- The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 XKC's basketball team
- The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 D Carneginon
- 地表最强的MySQL安装一键式安装,信不信你下完我就给你装好!附各种Mysql安装失败的解决办法(什么你安装失败了?快来看这个)