13届河南省省赛I题(dfs)
# include<iostream>
# include<algorithm>
# include<string>
# include<cstring>
using namespace std;
int a[10];
int g[10];
int to1(int i)
{
return (i+2)%8+1;
}
int to2(int i)
{
return (i+4)%8+1;
}
bool dfs(int x, int num)
{
g[x] = 1;
if(num==8)
{
return true;
}
for(int i=1; i<=8; ++i)
{
if(!g[i])
{
if(g[to1(i)]) return false;
else return dfs(g[to1(i)], num+1);
if(g[to2(i)]) return false;
else return dfs(g[to2(i)], num+1);
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
int num = 0;
bool cha = false;
string s;
cin>>s;
for(int i=0; i<8; ++i)
if(s[i]=='1')
{
num++;
a[i+1] = 1;
}
else a[i+1] = 0;
if(num==8)
{
cout<<"Yes"<<endl;
continue;
}
for(int i=1; i<=8; ++i)
{
memcpy(g, a, sizeof a);
if(!g[i])
{
if(g[to1(i)]) continue;
else
{
if(dfs(g[to1(i)], num+1))
cha = true;
}
if(g[to2(i)]) continue;
else
{
if(dfs(g[to2(i)], num+1))
cha = true;
}
if(cha) break;
}
}
if(cha) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
//L题
# include<iostream>
# include<algorithm>
using namespace std;
bool ck(double a, double b, double x, double y)
{
if(b*b*x*x + a*a*y*y <= a*a*b*b) return true;
else return false;
}
int main()
{
int t;
cin>>t;
while(t--)
{
double cnt = 0, num = 0;
double a1, b1, a2, b2;
cin>>a1>>b1>>a2>>b2;
for(double i=-8; i<=8; i+=0.005)
for(double j=-8; j<=8; j+=0.005)
{
if(ck(a1, b1, i, j) || ck(a2, b2, i, j)) cnt++;
num++;
}
double ans = cnt*1.0/40000*1.0;
printf("%.1f\n", ans);
}
return 0;
}
J题:甜甜圈
# include<iostream>
# include<algorithm>
# include<cmath>
using namespace std;
const int N = 1e5+10;
struct Range
{
int val, num;
bool operator< (const Range &w)const
{
return val > w.val;
}
}range[N];
int n, m;
int a1[N], a2[N], b[N];
int tr[N];
int lowbit(int x)
{
return x & -x;
}
void modify(int x, int v)
{
for(int i=x; i<=N; i+=lowbit(i)) tr[i] += v;
}
int query(int x)
{
int res = 0;
for(int i=x; i; i-=lowbit(i)) res += tr[i];
return res;
}
int main()
{
cin>>n>>m;
for(int i=1; i<=n+m; ++i) modify(i, 1);
for(int i=1; i<=n; ++i) cin>>a1[i];
for(int i=1; i<=m; ++i)
{
cin>>a2[i];
range[i] = {a2[i], i};
}
for(int i=n, j=m+1; i; --i, ++j)
range[j] = {a1[i], j};
sort(range+1, range+n+m+1);
int l, r;
int xx = range[1].num;
if(xx>m) r = m;
else r = m+1;
int ans = 0;
for(int i=1; i<=n+m; ++i)
{
int x = range[i].num;
l = r, r = x;
// cout<<l<<' '<<r<<endl;
modify(r, -1);
int res = abs(query(r)-query(l));
// cout<<res<<endl;
ans += res;
}
// cout<<endl;
cout<<ans<<endl;
return 0;
}