2017.10.6 QBXT 模拟赛
T1
Sort 一下与原数组比较 ,若有两个数或者没有数发生位置交换 ,则输出YES ,否则输出NO
#include <algorithm>
#include <cctype>
#include <cstdio>
#define N 1005000
int n, cnt1, cnt2, sum;
struct node
{
int num, pos;
bool operator < (node a)const
{
if (num != a.num) return num < a.num;
else return pos < a.pos;
}
}a[N];
int main(int argc, char *argv[])
{
freopen("sort.in", "r", stdin); freopen("sort.out", "w", stdout);
scanf("%d", &n);
for (int i = ; i <= n; ++i) scanf("%d", &a[i].num), a[i].pos=i;
std :: sort(a + , a + n + );
for (int i = ; i <= n; ++i)
{
if (a[i].pos > i) cnt1++;
if (a[i].pos < i) cnt2++;
}
if (cnt1 == || cnt2 == || (!cnt2 && !cnt1)) puts("YES");
else puts("NO");
return ;
fclose(stdin); fclose(stdout);
}
T2
同余方程组
前60%的数据可以用中国剩余定理
后面的数据 用数学构造
X%a1=b1
X%a2=b2
....
X+k1a1=b1
X+k2a2=b2
相减得到 k1a1-k2a2=b1-b2
解这个方程,用exgcd(a1,-a2,k1,k2)
Ax+by=gcd(a,b)
Ax+by=c;
把k1k2回带到原式中,求出x
X0=b1-k1a1
X%a1a2=x0
#include<iostream>
#include<cstdio>
typedef long long LL;
using namespace std; LL n,m[],a[];
LL exgcd(LL a,LL b,LL &x,LL &y)
{
if (b == )
{
x = , y = ;
return a;
}
LL r = exgcd(b, a % b, x, y);
LL tmp = x;
x = y;
y = tmp - a / b * y;
return r;
}
inline LL crt()
{
LL a1 = a[], a2, m2, d, c, m1=m[];
for (LL i = ; i <= ; ++i)
{
a2 = a[i], m2 = m[i];
c = a2 - a1;
LL x, y;
d = exgcd(m1, m2, x, y);
x = x * c / d;
int mod = m2 / d;
x = (mod + x % mod) % mod;
a1 += m1 * x;
m1 *= mod;
}
return a1;
}
int main(int argc, char *argv[])
{
freopen("mod.in", "r", stdin);
freopen("mod.out", "w", stdout);
for(int i = ; i <= ; i++) cin >> m[i] >> a[i];
cout << crt() << endl;
return ;
fclose(stdin); fclose(stdout);
}
T3
可以发现回文串是可以二分的
比如:bbbabcbaabcba 我们以第1个c为中心,发现回文半径是3,大于3一定不是回文串。当回文串长度为偶数的时候,我们需要特殊处理一下。
现在有一个结论:本质不同的回文串个数只有O(N)个
本质不同:字符串本身是不同的。
每一次处理完回文串,我们要把他的hash值记录下来。
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <map> using namespace std;
typedef unsigned long long ULL;
typedef long long LL;
char s[];
ULL h[], rh[], pw[];
int L;
ULL hs(int l, int r)
{
return h[r] - h[l - ] * pw[r - l + ];
}
ULL rhs(int l, int r)
{
return rh[l] - rh[r + ] * pw[r - l + ];
}
struct N
{
int a[];
bool ok()
{
int b[];
for (int i = ; i < ; i++) b[i] = a[i];
sort(b,b + );
for (int i = ; i < ; i++)
{
if (b[i] > && b[i] == b[i + ]) return true;
}
return false;
}
void clear()
{
memset(a, , sizeof(a));
}
};
LL ans = ;
map<ULL, LL> num;
map<ULL, N> A;
void solve_odd()
{
for (int i = ; i <= L; i++)
{
int l = ,r = min(i,L - i + ) + ;
while (r - l > )
{
int mid = (l + r) >> ;
if (hs(i - mid + , i + mid - ) == rhs(i - mid + , i + mid - )) l = mid;
else r = mid;
}
int p = l;
int tmp = p;
while (tmp >= && num.find(hs(i - tmp + , i + tmp - )) == num.end()) tmp--;
LL sum = ;
N st;
st.clear();
if (tmp >= )
{
sum = num[hs(i - tmp + , i + tmp - )];
st = A[hs(i - tmp + ,i + tmp - )];
}
while (tmp < p)
{
st.a[s[i + tmp]-'a'] += (tmp == ? : );
if (st.ok()) sum++;
num[hs(i - tmp, i + tmp)] = sum;
A[hs(i - tmp, i + tmp)] = st;
tmp++;
}
ans += sum;
}
}
void solve_even()
{
A.clear();
num.clear();
for(int i = ; i < L; i++)
{
int l = ,r = min(i,L - i) + ;
while (r - l > )
{
int mid = (l + r) >> ;
if (hs(i - mid + , i + mid) == rhs(i - mid + , i + mid)) l = mid;
else r = mid;
}
int p = l,tmp = p;
while (tmp >= && num.find(hs(i - tmp + , i + tmp)) == num.end()) tmp--;
LL sum = ;
N st;
st.clear();
if (tmp >= )
{
sum = num[hs(i - tmp + , i + tmp)];
st = A[hs(i - tmp + , i + tmp)];
}
while (tmp < p)
{
st.a[s[i + tmp + ] - 'a'] += ;
if (st.ok()) sum++;
num[hs(i - tmp, i + tmp + )] = sum;
A[hs(i - tmp, i + tmp + )] = st;
tmp++;
}
ans += sum;
}
}
int main()
{
freopen("str.in", "r", stdin);
freopen("str.out", "w", stdout);
scanf("%s", s + );
L = strlen(s + );
s[] = '#';
pw[] = ;
for(int i = ; i <= L; i++) pw[i] = pw[i - ] * ;
for(int i = ; i <= L; i++) h[i] = h[i - ] * + s[i];
for (int i = L; i >= ; i--) rh[i] = rh[i + ] * + s[i];
solve_odd();
solve_even();
printf("%lld\n", ans);
fclose(stdout);
return ;
}
2017.10.6 QBXT 模拟赛的更多相关文章
- 2017.10.7 QBXT 模拟赛
题目链接 T1 容斥原理,根据奇偶性进行加减 #include<iostream> #include<cstdio> using namespace std; typedef ...
- 2017.10.3 QBXT 模拟赛
题目链接 T1 模拟 #include <cstring> #include <cstdio> #define N 105000 int L,R; char s[N]; int ...
- 2017.10.5 QBXT 模拟赛
题目链接 T1 从小到大排序,用sum记录前缀和,然后枚举1~n个数 ,如果当前的前缀和 + 1小于a[i]的话 那么 sum + 1永远不可能拼出来 直接输出sum + 1 ,否则统计前缀和.最后如 ...
- 2017.10.4 QBXT 模拟赛
题目链接 T1 维护一个单调栈 #include <iostream> #include <cstdio> #define N 500000 #define rep(a,b,c ...
- 2017.10.2 QBXT 模拟赛
题目链接 T1 我们所要求得是(a*b)|x 也就是 使(a*b)的倍数小于x的个数之和 1<=x<=n 我们可以 找一个c使得 (a*b*c)<=x 由于我们所求的是一个三元有序对 ...
- 2017.10.1 QBXT 模拟赛
题目链接 T1 枚举右端点,前缀和优化.对于当前点x,答案为 sum[x][r]-sum[x][l-1]-(sum[z][r]-sum[z][l-1]) 整理为 sum[x][r]-sum[z][r] ...
- 2017 10.25 NOIP模拟赛
期望得分:100+40+100=240 实际得分:50+40+20=110 T1 start取了min没有用,w(゚Д゚)w O(≧口≦)O T3 代码3个bug :数组开小了,一个细节没注意, ...
- 2017.10.28 QB模拟赛 —— 下午
题目链接 T1 按x值排序 遇到第二种牌插入 遇到第一种牌 查询<=y 的最小值 删除他 splay multiset cys大佬说 multiset就是不去重的set, #include &l ...
- 2017.10.28 QB模拟赛 —— 上午
题目链接 T1 1e18 内的立方数有 1e6个 直接枚举可过 二分最优 考场用set 死慢.. #include <cstdio> int t; long long p; int ma ...
随机推荐
- 在VC6的debug框里面输出版权信息
在VC6的debug框里面输出版权信息,效果如下: 原理是: 新建一个批处理文档:如:"info.bat",放置到工程目录下[和dsw同级] @echo ===本程序作者是不要呵呵 ...
- HDU - 5015 233 Matrix(杨辉三角/前缀+矩阵快速幂)
233 Matrix In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23 ...
- 拓展kmp模板
算法描述:设字符串T,长度为n,字符串S,长度为m.在线性时间内求出T的每一个后缀所对应S的最长前缀. 假设T=“AAAAB”,S="AAAA". //拓展KMP ; //字符串长 ...
- android edittext 限制小数点后最多只能输入两位数字
android:inputType="numberDecimal" private InputFilter lengthFilter = new InputFilter() { @ ...
- [小工具] C#多线程|匿名委托传参数|测试网站压力--升级版
上次文章链接:http://www.sufeinet.com/thread-11-1-1.html写这些并不是不会用测试工具,也并不是无视测试工具,而是做为一个程序员希望用自己写的东西来完成一些功能, ...
- LeetCode: 389 Find the Difference(easy)
题目: Given two strings s and t which consist of only lowercase letters. String t is generated by rand ...
- this解惑
前言 要正确理解this,首先得理解执行上下文,这里推荐汤姆大叔的执行上下文,因为this是在运行代码时确认具体指向谁,箭头函数除外. 全局作用域中的this node: 每个javaScript文件 ...
- c# new三种用法
前几天去家公司面试,有一道这样的题:写出c#中new关键字的三种用法,思前想后挖空心思也只想出了两种用法,回来查了下msdn,还真是有第三种用法:用于在泛型声明中约束可能用作类型参数的参数的类型,这是 ...
- bzoj 3671: [Noi2014]随机数生成器【模拟+贪心】
降智好题 前面随机部分按照题意模拟,然后字典序贪心,也就是记录每个值的位置从1~nm依次看能不能取,能取的话更新行的取值范围(它上面的行一定取的列小于等于这个数取的列,下面行大于等于) #includ ...
- 洛谷P1549 棋盘问题(2)
P1549 棋盘问题(2) 题目描述 在N*N的棋盘上(1≤N≤10),填入1,2,…,N*N共N*N个数,使得任意两个相邻的数之和为素数. 例如:当N=2时,有: 其相邻数的和为素数的有: 1+2, ...