A. Square String?
题目:
思路分析:
就是前半和后半都一样 匹配就行
代码分析:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
inline int read() {
int x=0,f=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
ll _gcd(ll m, ll n){return n == 0 ? m : _gcd(n, m%n);}
ll _lcm(ll m, ll n){return m*n / _gcd(m, n);}
ll pows(ll base, ll power,ll mod){ll result=1;while(power>0){if(power&1){result=result*base%mod;}power>>=1;base=(base*base)%mod;}return result;}
ll poww(ll base, ll power){ll result=1;while(power>0){if(power&1){result=result*base;}power>>=1;base=(base*base);}return result;}
const int MAX=5e5+1;
int t;
bool cmp(int a,int b){return a>b;}
ll max(ll a,ll b){if(a>b)return a;else return b;}
void solve(){
string s;
cin>>s;
int n=s.size();
if(n%2!=0) cout<<"NO"<<endl;
else {
for(int i=0;i<n/2;i++){
if(s[i]!=s[i+n/2]){
{cout<<"NO"<<endl;return;}
}
}cout<<"YES"<<endl;
}
}
int main(){
cin>>t;
while(t--) solve();
// solve();
return 0;
}
B. Squares and Cubes
题目:
思路分析:
利用容斥定理 满足平方数的+满足立方数的-同时满足平方和立方的
代码实现:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
inline int read() {
int x=0,f=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
ll _gcd(ll m, ll n){return n == 0 ? m : _gcd(n, m%n);}
ll _lcm(ll m, ll n){return m*n / _gcd(m, n);}
ll pows(ll base, ll power,ll mod){ll result=1;while(power>0){if(power&1){result=result*base%mod;}power>>=1;base=(base*base)%mod;}return result;}
ll poww(ll base, ll power){ll result=1;while(power>0){if(power&1){result=result*base;}power>>=1;base=(base*base);}return result;}
const int MAX=5e5+1;
int t;
bool cmp(int a,int b){return a>b;}
ll max(ll a,ll b){if(a>b)return a;else return b;}
map<ll,int>mp;
vector<ll>v;
void solve(){
ll n;cin>>n;
if(n==1) {cout<<1<<endl;return;}
cout<<ll(floor(sqrt(n)))+ll(floor(cbrt(n)))-ll(lower_bound(v.begin(),v.end(),n)-v.begin())<<endl;
}
int main(){
cin>>t;
for(int i=1;;i++){
if(i*i>1e9){
break;
}
mp[i*i]++;
}
for(int i=1;;i++){
if(i*i*i>1e9){
break;
}
if(mp[i*i*i]==1) v.push_back(i*i*i);
}
while(t--) solve();
// solve();
return 0;
}
C. Wrong Addition
题目:
思路分析:
类似于进制转化的思路 看代码吧!
代码实现:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
inline int read() {
int x=0,f=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
ll _gcd(ll m, ll n){return n == 0 ? m : _gcd(n, m%n);}
ll _lcm(ll m, ll n){return m*n / _gcd(m, n);}
ll pows(ll base, ll power,ll mod){ll result=1;while(power>0){if(power&1){result=result*base%mod;}power>>=1;base=(base*base)%mod;}return result;}
ll poww(ll base, ll power){ll result=1;while(power>0){if(power&1){result=result*base;}power>>=1;base=(base*base);}return result;}
const int MAX=5e5+1;
int t;
bool cmp(int a,int b){return a>b;}
ll max(ll a,ll b){if(a>b)return a;else return b;}
map<ll,int>mp;
vector<ll>v;
void solve(){
string a,b;
cin>>a>>b;
int n=a.size();
int m=b.size();
// cout<<n<<" "<<m<<endl;
string s="";
stack<int>s1;
stack<int>s2;
while (!s1.empty()) {
s1.pop();
}
while (!s2.empty()) {
s2.pop();
}
for(int i=0;i<n;i++){
s1.push(a[i]-'0');
}
for(int i=0;i<m;i++){
s2.push(b[i]-'0');
}
// cout<<s1.size()<<" "<<s2.size()<<endl;
while (!s2.empty()) {
if(s1.empty()) break;
int nows=s2.top();
int nowa=s1.top();
// cout<<nows<<" "<<nowa<<endl;
s2.pop();s1.pop();
if(nows>=nowa){
s+=(nows-nowa)+'0';
}
else{
if(s2.empty()) {cout<<-1<<endl;return;}
nows+=(s2.top()*10);
if(nows-nowa>=10||nows<nowa){cout<<-1<<endl;return;}
s2.pop();
s+=(nows-nowa+'0');
if(s2.size()<s1.size()){cout<<-1<<endl;return;}
}
}
if(s1.empty()){
while (!s2.empty()) {
int now=s2.top();
s2.pop();
s+=now+'0';
}
}
reverse(s.begin(),s.end());
string ss="";
int flag=1;
int ans=0;
for(int i=0;i<s.size();i++){
if(s[i]!='0'){
ans=i;break;
}
}
for(int i=ans;i<s.size();i++){
cout<<s[i];
}
cout<<endl;
}
int main(){
cin>>t;
while(t--) solve();
// solve();
return 0;
}
D. New Year's Problem
题目:
思路分析:
最大值的最小值可以考虑二分法
然后其实就是要让一个值满足大于每列的最小值 要大于至少二行的最小值
代码实现:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
inline int read() {
int x=0,f=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
ll _gcd(ll m, ll n){return n == 0 ? m : _gcd(n, m%n);}
ll _lcm(ll m, ll n){return m*n / _gcd(m, n);}
ll pows(ll base, ll power,ll mod){ll result=1;while(power>0){if(power&1){result=result*base%mod;}power>>=1;base=(base*base)%mod;}return result;}
ll poww(ll base, ll power){ll result=1;while(power>0){if(power&1){result=result*base;}power>>=1;base=(base*base);}return result;}
const int MAX=5e5+10;
int t;
bool cmp(int a,int b){return a>b;}
ll max(ll a,ll b){if(a>b)return a;else return b;}
int ch(int n,int m,vector<vector<int>>&a,int mid){
for(int i=0;i<n;i++){
int flag=0;
for(int j=0;j<m;j++){
if(a[j][i]>=mid){
flag=1;
}
}
if(!flag) return 0;
}
for(int i=0;i<m;i++){
int t=0;
for(int j=0;j<n;j++){
if(a[i][j]>=mid){
t++;
}
}
if(t>=2){
return 1;
}
}
return 0;
}
void solve(){
int m,n;cin>>m>>n;
vector<vector<int>>v(m,vector<int>(n));
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
cin>>v[i][j];
}
}
ll l=0,r=1e9;
ll ans=0;
while (l<=r) {
int mid=l+r>>1;
if(ch(n,m,v,mid)){ans=mid;l=mid+1;}
else r=mid-1;
}
cout<<ans<<endl;
}
int main(){
cin>>t;
while(t--) solve();
// solve();
return 0;
}
E. MEX and Increments
题目:
思路分析:
题意就是让这个序列缺失的最小非负数的为i 的最小操作数
我们先预处理每个数出现的次数
然后找到第一个次数为0的数
之前的数都放入到优先队列中(大顶堆)
要让你一个数满足 首先要让之前的数都补全 然后这个数加上去
所以可以利用前缀和的思想
代码实现:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
inline int read() {
int x=0,f=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
ll _gcd(ll m, ll n){return n == 0 ? m : _gcd(n, m%n);}
ll _lcm(ll m, ll n){return m*n / _gcd(m, n);}
ll pows(ll base, ll power,ll mod){ll result=1;while(power>0){if(power&1){result=result*base%mod;}power>>=1;base=(base*base)%mod;}return result;}
ll poww(ll base, ll power){ll result=1;while(power>0){if(power&1){result=result*base;}power>>=1;base=(base*base);}return result;}
const int MAX=5e5+10;
int t;
bool cmp(int a,int b){return a>b;}
ll max(ll a,ll b){if(a>b)return a;else return b;}
void solve(){
priority_queue<int>p;
while (!p.empty()) {p.pop();}
int cnt[MAX];
int n;cin>>n;
for(int i=0;i<=n;i++) {cnt[i]=0;}
for(int i=0;i<n;i++) {int x;cin>>x;cnt[x]++;}
ll tot=0,d=0;
for(int i=0;i<=n;i++){
ll now=cnt[i];now+=tot;cout<<now<<" ";d=i+1;
if(cnt[i]==0){
if(p.empty()) break;
tot+=i-p.top();p.pop();
}
while (cnt[i]>1) {p.push(i);cnt[i]--;}
}
for(int i=d;i<=n;i++) cout<<-1<<" ";
cout<<endl;
}
int main(){
cin>>t;
while(t--) solve();
// solve();
return 0;
}